忽略第一行的两个文件夹中的差异文件
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
而不是 +1
。 tail
行编号从第 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::
(由于在几行未忽略的差异内)。
我有两个文件夹要比较,但我想忽略所有文件中的第一行。我试过了
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
而不是 +1
。 tail
行编号从第 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::/' '{}' ';'
. 之类的东西在前面添加一个魔法字符串,例如 - 使用
diff -Nr --ignore-matching-lines=^IGNORE_THIS_LINE:: ...
比较结果。- 将输出通过管道传输到
sed s/IGNORE_THIS_LINE:://
,以过滤掉任何仍然出现的IGNORE_THIS_LINE::
(由于在几行未忽略的差异内)。
- 将输出通过管道传输到
IGNORE_THIS_LINE::