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



类似的帖子在这里:

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

在这里:

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

如果您通过&&链接这些命令,您将获得一个方便的单行;)


使用包含文件

如果要使用包含文件,可以使用此方法:

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

相关内容

  • 没有找到相关文章

最新更新