只有包括递归DIFF符合给定模式的文件(Only include files that match

2019-07-28 22:47发布

你怎么能在两个目录文件执行递归DIFF(A和B):

$ diff -r a b

但仅看文件,其名称匹配给定模式。 例如,使用find命令提供相同的语法,这将是这样的:

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

这将显示出A和B具有相同的名称和路径文件之间的差异列表,其中有他们的名字“疯狂”。

实际上,我在寻找它可在DIFF在 - 排除选项相反。

Answer 1:

也许这是一个有点间接的,但它应该工作。 您可以使用find来获得文件的列表匹配的模式,然后在“排除”所有这些文件:

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

-X -将使diff读取标准输入模式,并排除任何匹配。 这应该工作提供您的文件不具有有趣字符像*? 在他们的名字。 唯一的缺点是,你的差异将不包括find命令,所以上市diff命令是没有多大用处的。

(我只用GNU测试它finddiff )。

编辑

由于唯一的非GNU find没有-printfsed可以作为一种替代方案:

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

这也是假设非GNU diff具有-X ,我不知道。



Answer 2:

我不能使它与工作-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/file ,使之and/a/file



文章来源: Only include files that match a given pattern in a recursive diff
标签: shell unix diff