此处有类似帖子:
Diff files present in two different directories
在这里:
https://superuser.com/q/602877/520666
但不是我想要的。
我有2个目录(包含子目录和不同的文件类型 - 二进制文件,图像,HTML等)。
我希望能够递归地比较两个目录之间具有特定扩展名(例如.html,.strings等)的文件 - 它们可能存在于(子)目录中,也可能不存在。
我怎样才能做到这一点?差异似乎只支持排除,我不知道如何利用Find来实现这一点。
么?
答案 0 :(得分:0)
您可以使用find:
排除所有不需要的fileendings(此版本仅匹配文件结尾)
diff -r -x `find . -type f -name '*.*' | sed 's|.*\.|.*\.|' | sort -u | grep -v YOURFILETYPE | paste -sd "|"` ...rest of diff command
或者您预先生成排除文件列表并将其传递给diff:
(此版本还匹配您在include.file中指定的文件名和所有其他正则表达式)
find /dirA -type f | grep -v YOURFILEENDING > exclude.list
find /dirB -type f | grep -v YOURFILEENDING >> exclude.list
diff -X exclude.list -r /dirA /dirB
如果您通过&&
链接这些命令,您将获得一个方便的oneliner;)
WITH INCLUDE FILE
如果要使用包含文件,可以使用此方法:
以下是一个例子:
复杂的内联版本:
(此版本仅匹配文件结尾)
diff -r -x `find . -type f -name '*.*' | sed 's|.*\.|.*\.|' sort -u | grep -v -f include.file | paste -sd "|"` /dirA /dirB
稍微简单的版本:
(此版本还匹配您在include.file中指定的文件名和所有其他正则表达式)
find /dirA -type f | grep -v -f include.file > exclude.list
find /dirB -type f | grep -v -f include.file >> exclude.list
diff -X exclude.list -r /dirA /dirB
include.file中的每一行都是grep regex / expression:
log
txt
fileending3
whateverfileendingyoulilke
fullfilename.txt
someotherregex.*
注意强>
我没有运行这些,因为我离电脑不远。 我希望我的语法正确。
答案 1 :(得分:0)
您可以做的最简单的事情是比较整个目录:
diff -r /path/the/first /path/the/second
它将显示哪些文件只在一个目录中,哪些文件以二进制方式不同,以及两个目录中任何文本文件的完整差异。
您可以通过简单地读取每行路径的文件来循环遍历一组相对路径:
while IFS= read -u 9 relative_path
do
diff "/path/the/first/%{relative_path}" "/path/the/second/%{relative_path}"
done 9< relative_paths.txt
对一组特定的扩展名执行此操作同样很容易:
shopt -s globstar
while IFS= read -u 9 extension do
diff "/path/the/first/"**/*."${extension}" "/path/the/second/"**/*."${extension}"
done 9< extensions.txt