类似的帖子在这里:
差异文件存在于两个不同的目录中
在这里:
https://superuser.com/q/602877/520666
但不是我想要的。
我有 2 个目录(包含子目录和不同的文件类型——二进制、图像、html 等)。
我希望能够在两个目录之间递归比较具有特定扩展名(例如 .html、.string 等)的文件——它们可能存在于也可能不存在这两个(子)目录中。
我怎样才能做到这一点? Diff 似乎只支持排除项,我不确定如何利用 Find 来实现这一点。
建议?
您可以使用 find 排除所有不需要的文件结尾:
(此版本仅与文件结尾匹配)
diff -r -x `find . -type f -name '*.*' | sed 's|.*.|.*.|' | sort -u | grep -v YOURFILETYPE | paste -sd "|"` ...rest of diff command
或者,您预先生成排除文件的列表并将其传递给差异:
(此版本还与您在 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
如果您通过&&
链接这些命令,您将获得一个方便的单行;)
使用包含文件
如果要使用包含文件,可以使用此方法:
- 指定包含文件
- grep 匹配文件夹中的所有文件,并将您的包含文件转换为用于差异的排除文件(diff 仅接受排除文件)
下面是一个示例:
复杂的内联版本:
(此版本仅与文件结尾匹配)
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.*
注意
我没有运行这些,因为我离电脑还很远。 我希望我所有的语法都是正确的。
您可以做的最简单的事情是比较整个目录:
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