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

时间:2016-07-03 17:14:14

标签: bash unix diff gnu

我有两个文件夹,我想要区分,除了我想忽略所有文件中的第一行。我试过了

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

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

2 个答案:

答案 0 :(得分:2)

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

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

注意我使用的是+2而不是+1tail行号从第1行而不是0

开始

答案 1 :(得分:2)

如果要忽略的第一行具有可由POSIX正则表达式匹配的独特格式,则可以使用diff的{​​{1}}选项告诉它忽略这些行

如果不这样做,您想要采取的方法可能取决于您的确切要求。你说你“想要差异化”文件,但是如果它支持该功能,那么你的结果输出需要与--ignore-matching-lines=...得到的结果完全匹配并不明显。 (例如,您是否需要差异中的行号来正确识别原始文件中的行号?)

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

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