我试图diff
在目录的两个副本(例如工作副本和备份副本)中找到所有同名文件。例如,我可以diff
在两个副本中找到两个同名文件:
> diff d1/f.cpp d2/f.cpp
或者我可以找到目录之间的差异:
> diff d1 d2
但是我怎样才能找到*.cpp
文件之间的差异呢?
> diff d1/*.cpp d2/*.cpp
似乎不起作用(原因很明显)。
[使用循环可能很容易解决,但我正在尝试寻找一种更优雅的方法]
答案1
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 文件的文本文件*.cpp
。您可以使用以下命令执行此操作:
ls -I "*.cpp" > excluded_files
其中-I "*.cpp"
参数忽略所有 .cpp 文件。请注意,引号是必需的。
答案2
您可以使用 shell 循环对每个文件运行 diff,尽管这不会捕获 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
看http://mywiki.wooledge.org/BashFAQ/100有关 bash 中的字符串操作的更多信息。
顺便说一句,版本控制系统(例如 subversion、git、mercurial 等...)可以使这种类型的差异变得更加容易。
答案3
在我问了这个问题一段时间后,我发现meld
diff 实用程序,从那时起我就一直在使用它。这是一个很棒的基于 GUI 的程序,它使文件和目录之间的比较和合并变得非常容易。它可以进行双向或三向比较。
具体来说,它回答了我最初的问题,因为它向您展示了目录内容的颜色编码比较,并允许您通过双击文件名来比较特定文件。
如果需要三向以上的比较,那么gvimdiff
(基于vim
编辑器)也是一个很好的选择,可以提供此功能。
答案4
有一个轻量级的解决方案:
- 设置这个小插件http://www.vim.org/scripts/script.php?script_id=5309
diff dir1 dir2 | vim -R -
在 shell 上执行
它将为更改的文件添加折叠和并排比较。