我的场景是使用以下命令并排执行 diff 目录:
diff -ry <folder1> <folder2>
以及 diff 输出中的行号。默认情况下,行号不会显示在并排差异中,并且该参数--new-line-format
不适用于diff -y
仅适用于diff -u
。
我尝试过的做法是[仅适用于文件]:
diff -y <(cat -n file1) <(cat -n file2)
生成行号。上面的命令首先生成行号,然后将其传递给 diff 命令,因此行号在 diff 结果中保持不变。
但到了使用的时候diff -ry
,我就无能为力了。有没有办法xargs
在命令中使用类似[如预处理器]的东西来应用 cat -n diff -ry
?
答案1
您可以将内联diff -ru
输出转换为并排演示文稿,带行号和颜色使用Python程序cdiff
也称为cdiff.pycdiff
(不要与的包装器混淆colordiff
),作者 Matthew Wang。
按照链接中给出的任何建议安装方法进行操作,或者只需将cdiff.py
下载的脚本提取到您的 PATH 中,然后您就可以执行以下操作
diff -ru dir1 dir2 | cdiff.py -s
答案2
史蒂芬·哈里斯已经给出了很好的答案这个问题的先前版本。不幸的是,它无法处理文件名中包含换行符的病态情况。这是他处理该案例的答案的一个小修改。 (我还将其更改为使用cat -n
而不是nl
,并使用选项-y
。diff
)
find folder1 -type f -exec bash -c 'for file1
do
file2="${file1/folder1/folder2}"
echo "Comparing $file1 to $file2"
diff -y <(cat -n "$file1") <(cat -n "$file2")
done' bash {} +
xargs
由于您在对斯蒂芬的回答的评论中要求解决方案,所以您可以:
find folder1 -type f -print0 | xargs -0 bash -c 'for file1
do
file2="${file1/folder1/folder2}"
echo "Comparing $file1 to $file2"
diff -y <(cat -n "$file1") <(cat -n "$file2")
done' bash
请注意,这些命令必须在 中完成bash
,因为 POSIX shell 不支持 ,并且解决方案必须在 GNU 环境中完成,因为 POSIX 不支持或。 (当然,您可以替换为并删除,但是这样您将失去处理包含换行符的文件名的能力。)${parameter/pattern/string}
xargs
find -print0
xargs -0
-print0
-print
-0