如何在unix中递归并排比较目录与比较中的行号?

如何在unix中递归并排比较目录与比较中的行号?

我的场景是使用以下命令并排执行 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,并使用选项-ydiff

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}xargsfind -print0xargs -0-print0-print-0

相关内容