如何递归地比较两个目录并忽略每个文件的前 n 行

如何递归地比较两个目录并忽略每个文件的前 n 行

这个问题类似于如何仅比较两个文件的第一行?,但以递归方式进行。我想比较两个目录,但是:

  • 仅比较两个目录中每个文件的前 N ​​行
  • 比较两个目录中每个文件除前 N 行之外的所有内容

答案1

我给你的第一个建议是使用融合。它也可以通过命令行运行。

它具有以下特点特征您可能感兴趣:

  • 逐个文件比较两个或三个目录,显示新的、丢失的和更改的文件。
  • 使用内置的正则表达式文本过滤来忽略不感兴趣的差异。

您唯一需要做的就是找出正确的正则表达式模式,可以用来忽略不重要的数据(取决于您想要忽略的元数据的语法)。

答案2

这两个循环用于diff -qr进行初始比较,主要是为了轻松获取文件名,然后对找到的文件对进行单独的比较。sed用于清除前 N 行,或仅保留前 N 行。首先清除 N 行:

N=2
diff -qr dir1 dir2 |
grep '^Files.*differ' |
while read x a x b x
do  diff --label "$a" --label "$b" -u <(sed "1,${N}s/.*//" <"$a") <(sed "1,${N}s/.*//" <"$b")
done

保持 N 不变:

diff -qr dir1 dir2 |
grep '^Files.*differ' |
while read x a x b x
do  diff --label "$a" --label "$b" -u <(sed -n "1,${N}p" <"$a") <(sed -n "1,${N}p" <"$b")
done

假设文件名中没有空格/制表符。

相关内容