递归比较不同目录中特定的文件。
递归比较不同目录中特定的文件。
类似的帖子在这里:
还有这里:
https://superuser.com/q/602877/520666
但并不是我要找的。
我有两个目录(包含子目录和不同类型的文件-- 二进制、图像、html等)。
我想能够递归地比较两个目录中特定扩展名的文件(例如.html、.strings等)-- 它们可能存在于任何一个(子)目录中,也可能不存在。
我该如何完成这个任务?Diff似乎只支持排除,我不确定我如何利用find实现这个目标。
有什么建议吗?
admin 更改状态以发布 2023年5月21日
你可以做的最简单的事情就是比较整个目录:
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
你可以使用find来排除所有不需要的文件:
(这个版本只匹配文件结尾)
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
如果你通过&&
链接这些命令,你将得到一个方便的一行命令 😉
使用包含文件
如果你想使用一个包含文件,你可以使用这个方法:
- 你指定包含文件
- grep匹配文件夹中的所有文件,并将你的包含文件转换成diff的排除文件(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正则表达式/表达式:
log txt fileending3 whateverfileendingyoulilke fullfilename.txt someotherregex.*
注意
我没有运行过这些命令,因为我离电脑很远。
我希望我得到了所有语法正确。