Answers:
您可以使用为每个文件运行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等)将使这种类型的比较容易得多。
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文件。请注意引号是必需的。
有一个轻量级的解决方案:
diff dir1 dir2 | vim -R -
壳它将添加折叠和并排比较更改的文件。
echo "${file##*/}";
在diff
命令之前添加了一个附加项,因此人们知道实际上正在比较哪些文件。另外,如@Rinzwind的答案中所述,此方法不涵盖以下情况:两个目录中的文件列表不完全相同。