忽略第一行的两个文件夹中的差异文件

Diff files in two folders ignoring the first line

我有两个文件夹要比较,但我想忽略所有文件中的第一行。我试过了

  diff -Nr <(tail -n +1 folder1/) <(tail -n +1 folder2/) 

但这显然不是正确的方法。

使用进程替换是创建中间输入文件描述符的正确方法。但是 tail 不适用于文件夹。只需遍历文件夹中的所有文件:

for f in folder1/*.txt; do
    tail -n +2 $f | diff - <(tail -n +2 folder2/$(basename $f))
done

注意我使用了 +2 而不是 +1tail 行编号从第 1 行开始,而不是 0

如果您要忽略的第一行具有可以被 POSIX 正则表达式匹配的独特格式,那么您可以使用 diff--ignore-matching-lines=... 选项来告诉它忽略这些行。

否则,您要采用的方法可能取决于您的具体要求。你说你 "want to diff" 文件,但如果它支持该功能,你的结果输出需要如何忠实地匹配你从 diff -Nr 获得的内容并不明显。 (例如,是否需要diff中的行号才能正确识别原始文件中的行号?)

最准确的忠实方法可能如下:

  • 将每个目录复制到新位置,使用 cp --recursive ...
  • 编辑每个文件的第一行,使用 find -type f -exec sed -i '1 s/^/IGNORE_THIS_LINE::/' '{}' ';'.
  • 之类的东西在前面添加一个魔法字符串,例如 IGNORE_THIS_LINE::
  • 使用diff -Nr --ignore-matching-lines=^IGNORE_THIS_LINE:: ...比较结果。
    • 将输出通过管道传输到 sed s/IGNORE_THIS_LINE:://,以过滤掉任何仍然出现的 IGNORE_THIS_LINE::(由于在几行未忽略的差异内)。