如何跨目录比较多个文件?


19

我试图diff在目录的两个副本(例如工作目录和备份目录)的所有同名文件之间找到。例如,我可以在diff两个文件中使用两个相同名称的文件:

> diff d1/f.cpp d2/f.cpp

或者我可以找到目录之间的差异:

> diff d1 d2

但是如何才能*.cpp仅找到文件之间的差异?

> diff d1/*.cpp d2/*.cpp

似乎不起作用(出于明显的原因)。

[使用循环可能很容易解决,但是我正在尝试找到一种更优雅的方法]

Answers:


13

您可以使用为每个文件运行diff的shell循环,尽管这不会捕获d2包含文件但d1却没有的情况。不过这可能就足够了。

for file in d1/*.cpp; do
    diff "$file" "d2/${file##*/}"
done

或全部一行:

for file in d1/*.cpp; do diff "$file" "d2/${file##*/}"; done

${file##*/}部分是特殊的参数扩展。

如果文件变量包含d1/hello.cpp"${file##*/}"则将扩展为hello.cpp(文件的值,但是所有内容都包括(最后一个)/删除)。

因此"d2/${file##*/}"将导致,d2/hello.cpp因此产生的diff命令为diff d1/hello.cpp d2/hello.cpp

有关bash中字符串操作的更多信息,请参见http://mywiki.wooledge.org/BashFAQ/100

附带说明一下,版本控制系统(例如subversion,git,mercurial等)将使这种类型的比较容易得多。


我认为这是两个很好的答案,当存在多种文件类型时,这种方法更为简单(尽管我在问题中提到我正在寻找一种无循环解决方案),所以我接受了它。echo "${file##*/}";diff命令之前添加了一个附加项,因此人们知道实际上正在比较哪些文件。另外,如@Rinzwind的答案中所述,此方法不涵盖以下情况:两个目录中的文件列表不完全相同。
ysap 2012年

52

diff -qr {DIR1} {DIR2} 在两个目录中都执行所有文件。

  • q 仅显示差异
  • r确实是递归的。如果您不需要它,则将其删除

您不能diff直接告诉使用通配符,但可以添加:

-x PAT  --exclude=PAT
    Exclude files that match PAT.

-X FILE    --exclude-from=FILE
   Exclude files that match any pattern in FILE.

排除文件。因此,如果您只想*.cpp最简单的方法是创建一个文本文件,列出所有未列出的文件*.cpp。您可以使用以下命令执行此操作: ls -I "*.cpp" > excluded_files其中,-I "*.cpp"参数忽略所有.cpp文件。请注意引号是必需的。


简单,并且完美无瑕。
JoseGómez'16

4

问了问题一段时间后,我发现了melddiff实用程序,并且从那时起一直在使用它。这是一个很棒的基于GUI的程序,它使文件和目录之间的比较和合并变得非常容易。它进行两路或三路比较。

具体来说,它回答了我的原始问题,因为它向您显示了目录内容的颜色编码比较,并允许您通过双击文件名来比较特定文件。

如果需要进行三项以上的比较,那么gvimdiff(基于vim编辑器)也可以提供此功能。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.