将两个目录中的文件存在与Linux中的第三个目录进行比较

时间:2019-02-23 13:40:15

标签: linux bash directory compare diff

如何比较dir1dir2dir3中文件的存在。

例如:

dir1     dir2     dir3 
file1    file2    file1
file3    file4    file2
file5    file6    file3
file9             file5
                  file6
                  file7 

,输出如下:

only in dir1: file9
only in dir2: file4
only in dir3: file7

编辑:

我正在寻找使用命令行的差异,而且我正在使用centos 7。

我使用diff dir1 dir2比较两个目录,发现diff3比较三个文件,而不比较三个目录。

5 个答案:

答案 0 :(得分:1)

这一行小的unix命令可以为您做到这一点。但是,只有在您的文件和目录不包含空格的情况下,它才有效:

find dir{1..3} -mindepth 1 -type f | tr '/' ' ' | sort -k2,2 | uniq -u -f 1 | sed -e 's/ /: /' -e 's/^/only in /'

查找首先列出所有目录及其文件。根据您的需要进行调整,您的目录可能实际上不是dir1,dir2和dir3。

比起我们用空格替换路径的'/',因为uniq只能通过空格来确定字段。我们对第二个字段(文件)进行排序。比我们只为第二个字段打印唯一行,而跳过第一个字段(-f 1)。比我们使用sed更好地打印唯一路径。

答案 1 :(得分:1)

另一个变体:

find dir*/ -type f | sort -t/ -k2 | uniq -u -s 4 | sort
dir1/file9
dir2/file4
dir3/file7

化妆品:

find dir*/ -type f | sort -t/ -k2 | uniq -u -s 4 | sort | sed 's/dir/Only in dir/g' | sed 's/\//: /g'
Only in dir1: file9
Only in dir2: file4
Only in dir3: file7

答案 2 :(得分:1)

在GNU awk中:

$ awk 'BEGINFILE {
    n=split(FILENAME,t,"/")                    # I should use gensub here too
    f[t[n]]++                                  # count distinct filenames
    p[t[n]]=gensub(/\/[^/]*$/,"",1,FILENAME)   # store path (collisions dont matter)
}
END {
    for(i in f)                                # all files encountered
        if(f[i]==1)                            # look for singles
            printf "only in %s: %s\n", p[i], i # ... and output them 
}' dir1/* dir2/* dir3/*                        # or dir[123]/*

输出:

only in dir1: file9
only in dir2: file4
only in dir3: file7

对于非GNU awks:

$ for i in dir[123]/*
do echo $i
done | 
awk -F/ ' {
    t=$NF
    f[t]++
    sub(/\/[^/]*$/,"")
    p[t]=$0
}
END {
    for(i in f)
        if(f[i]==1)
            printf "only in %s: %s\n", p[i], i
}'

答案 3 :(得分:0)

meld是一个很好的图形化差异前端,它将向您显示文件的并排列表。使用Ubuntu软件中心安装融合:

sudo apt-get install meld
meld dir1 dir2 dir3

检查是否有帮助

答案 4 :(得分:0)

找到awk:

find . -mindepth 2 -name '*' |  
awk -F/ '
  { 
    seen[$NF]++
    path[$NF] = $(NF-1)
  }
  END {
    for(i in seen) {
      if(seen[i]==1)
        print "only in "path[i] ": " i
    }
  }
'