【问题标题】:Compare the presence of files in two directories to third directory in Linux [closed]将两个目录中文件的存在与 Linux 中的第三个目录进行比较 [关闭]
【发布时间】:2019-07-17 10:34:44
【问题描述】:

如何比较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比较三个文件而不是三个目录。

【问题讨论】:

    标签: linux bash directory compare diff


    【解决方案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 来很好地打印唯一路径。

    【讨论】:

      【解决方案2】:

      另一种变体:

      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
      

      【讨论】:

      • 这很像我的回答。仅当所有文件夹名称具有相同数量的字符时,也使用 -s 4 才有效。
      • 本问题中没有明确写出。然后我看到你回答了。
      【解决方案3】:

      在 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
      }'
      

      【讨论】:

        【解决方案4】:

        meld 是一个很好的图形差异前端,可以并排显示文件列表。使用 Ubuntu 软件中心安装 meld:

        sudo apt-get install meld
        meld dir1 dir2 dir3
        

        检查是否对您有帮助

        【讨论】:

        • 如果可以试试融合
        【解决方案5】:

        用 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
            }
          }
        '
        

        【讨论】:

          猜你喜欢
          • 2017-03-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-20
          • 2015-04-17
          • 1970-01-01
          • 1970-01-01
          • 2020-01-18
          相关资源
          最近更新 更多