如何在两个目录(a和b)中执行文件的递归diff:
$ diff -r a b
但只查看名称与给定模式匹配的文件。例如,使用find命令中提供的相同语法,它将如下所示:
$ diff -r a b -name "*crazy*"
将显示a和b中具有相同名称和路径的文件之间的差异,其名称中包含“疯狂”。
实际上,我正在寻找与diff中可用的--exclude选项相反的方法。
答案 0 :(得分:13)
也许这有点间接,但应该有效。您可以使用find
获取不匹配模式的文件列表,然后“排除”所有这些文件:
find a b -type f ! -name 'crazy' -printf '%f\n' | diff -r a b -X -
-X -
将使diff
从stdin读取模式并排除任何匹配的模式。如果您的文件名称中没有*
或?
这样的有趣字符,则应该可以使用此功能。唯一的缺点是你的diff不会包含find
命令,所以列出的diff
命令没那么有用。
(我只用GNU find
和diff
进行了测试。
修改强>:
由于只有非GNU find
没有-printf
,因此可以使用sed
作为替代:
find a b -type f ! -name '*crazy*' -print | sed -e 's|.*/||' | diff -X - -r a b
这也假设非GNU diff
有-X
,我不知道。
答案 1 :(得分:0)
我无法使其与-X -
一起使用,因此我使用了另一种方法-让find
根据我的要求递归查找文件,并让diff
比较各个文件:< / p>
a="/your/dir"
b="/your/other/dir"
for f in $(find $a -name "*crazy*" | grep -oP "^$a/\K.*"); do
diff -u $a/$f $b/$f
done
或者,一行:
a="/your/dir" && b="/your/other/dir" && for f in $(find $a -name "*crazy*" | grep -oP "^$a/\K.*"); do diff -u $a/$f $b/$f; done
此grep -oP "^$a/\K.*"
用于提取相对于目录a
的路径,即,它从/your/dir/
中删除/your/dir/and/a/file
,使其成为and/a/file
。 / p>