25

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

$ diff -r a b

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

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

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

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

4

2 回答 2

19

也许这有点间接,但它应该起作用。您可以使用find获取与模式匹配的文件列表,然后“排除”所有这些文件:

find a b -type f ! -name 'crazy' -printf '%f\n' | diff -r a b -X -

-X -将使diff从标准输入读取模式并排除任何匹配的内容。如果您的文件没有类似*?名称中的有趣字符,这应该可以工作。唯一的缺点是您的 diff 不会包含该find命令,因此列出的diff命令不是那么有用。

(我只用 GNUfind和测试过它diff)。

编辑

由于只有非 GNUfind没有-printf,sed可以用作替代方案:

find a b -type f ! -name '*crazy*' -print | sed -e 's|.*/||' | diff -X - -r a b

这也是假设非 GNUdiff-X我不知道的。

于 2012-04-12T22:08:08.423 回答
1

我无法使用它-X -,所以我使用了不同的方法 - 让find根据我的要求递归查找文件并diff比较单个文件:

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/fileand/a/file

于 2018-11-09T12:49:25.070 回答