递归比较不同目录中特定的文件。

12 浏览
0 Comments

递归比较不同目录中特定的文件。

类似的帖子在这里:

比较两个不同目录中存在的差异文件

还有这里:

https://superuser.com/q/602877/520666

但并不是我要找的。

我有两个目录(包含子目录和不同类型的文件-- 二进制、图像、html等)。

我想能够递归地比较两个目录中特定扩展名的文件(例如.html、.strings等)-- 它们可能存在于任何一个(子)目录中,也可能不存在。

我该如何完成这个任务?Diff似乎只支持排除,我不确定我如何利用find实现这个目标。

有什么建议吗?

admin 更改状态以发布 2023年5月21日
0
0 Comments

你可以做的最简单的事情就是比较整个目录:

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

0
0 Comments

你可以使用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

如果你通过&&链接这些命令,你将得到一个方便的一行命令 😉


使用包含文件

如果你想使用一个包含文件,你可以使用这个方法:

  1. 你指定包含文件
  2. 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.*


注意

我没有运行过这些命令,因为我离电脑很远。
我希望我得到了所有语法正确。

0