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

时间:2017-07-14 17:31:50

标签: bash unix compare diff

此处有类似帖子:

Diff files present in two different directories

在这里:

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

但不是我想要的。

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

我希望能够递归地比较两个目录之间具有特定扩展名(例如.html,.strings等)的文件 - 它们可能存在于(子)目录中,也可能不存在。

我怎样才能做到这一点?差异似乎只支持排除,我不知道如何利用Find来实现这一点。

么?

2 个答案:

答案 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

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

  1. 您指定包含文件
  2. grep匹配文件夹中的所有文件,并将includefile转换为diff的排除文件(diff只接受排除文件)
  3. 以下是一个例子:

    复杂的内联版本:

    (此版本仅匹配文件结尾)

    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