仅包含与递归diff中的给定模式匹配的文件

时间:2012-04-12 21:10:52

标签: shell unix diff

如何在两个目录(a和b)中执行文件的递归diff:

$ diff -r a b

但只查看名称与给定模式匹配的文件。例如,使用find命令中提供的相同语法,它将如下所示:

$ diff -r a b -name "*crazy*"

将显示a和b中具有相同名称和路径的文件之间的差异,其名称中包含“疯狂”。

实际上,我正在寻找与diff中可用的--exclude选项相反的方法。

2 个答案:

答案 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 finddiff进行了测试。

修改

由于只有非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>