你怎么能在两个目录文件执行递归DIFF(A和B):
$ diff -r a b
但仅看文件,其名称匹配给定模式。 例如,使用find命令提供相同的语法,这将是这样的:
$ diff -r a b -name "*crazy*"
这将显示出A和B具有相同的名称和路径文件之间的差异列表,其中有他们的名字“疯狂”。
实际上,我在寻找它可在DIFF在 - 排除选项相反。
你怎么能在两个目录文件执行递归DIFF(A和B):
$ diff -r a b
但仅看文件,其名称匹配给定模式。 例如,使用find命令提供相同的语法,这将是这样的:
$ diff -r a b -name "*crazy*"
这将显示出A和B具有相同的名称和路径文件之间的差异列表,其中有他们的名字“疯狂”。
实际上,我在寻找它可在DIFF在 - 排除选项相反。
也许这是一个有点间接的,但它应该工作。 您可以使用find
来获得文件的列表不匹配的模式,然后在“排除”所有这些文件:
find a b -type f ! -name 'crazy' -printf '%f\n' | diff -r a b -X -
该-X -
将使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
,我不知道。
我不能使它与工作-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
。