【问题标题】:How to find files with same name part in directory using the diff command?如何使用 diff 命令在目录中查找具有相同名称的文件?
【发布时间】:2015-05-19 22:23:49
【问题描述】:

我有两个目录,其中包含文件。目录 A 包含带有编号结尾的照片列表(例如 janet1.jpg laura2.jpg),目录 B 包含相同的文件,但结尾编号不同(例如 janet41.jpg laura33.jpg)。如何在忽略编号结尾的情况下从目录 A 和 B 中找到没有相应文件的文件?例如,目录 A 中有一个 rachael3,但目录 B 中没有 rachael\d。我认为在 bash 中可以使用 diff 命令,但我没有看到明显的方法。

【问题讨论】:

    标签: linux bash


    【解决方案1】:

    我看不到直接使用diff 的方法。在两个目录上使用求和工具(md5、sha1 等)可能会更容易,然后根据第一(求和)列对两个文件进行排序并比较/比较这些输出文件。

    或者,类似findimagedupes(不像diff 那样简单的比较或总和检查)可能是一种更简单(并且可能更有用)的解决方案。

    【讨论】:

      【解决方案2】:

      您似乎知道您的文件是相同的,如果它们存在并且您确定,每个目录只有一个。

      所以到diff目录的内容根据这个,只需要获取文件名的相关部分(“laura”,“janet”)。

      这可以通过简单地从ls 的输出中提取适当的部分来完成,如下所示:

      ls dir1/ | egrep -o '^[a-A]+'
      

      然后进行比较,比如说dir1 和dir2,你可以使用:

      diff <(ls dir1/ | egrep -o '^[a-A]+') <(ls dir2/ | egrep -o '^[a-A]+')
      

      【讨论】:

        【解决方案3】:

        假设文件被简单地重命名并且在其他方​​面相同,找到丢失文件的简单解决方案是使用md5sum(或sha或类似)和uniq:

        #!/bin/bash
        
        md5sum A/*.jpg B/*.jpg >index 
        awk '{print $1}' <index | sort >sums # delete dir/file
        
        # list unique files (missing from one directory)
        uniq -u sums | while read s; do
            grep "$s" index | sed 's/^[a-z0-9]\{32\}  //'
        done
        

        如果文件夹包含重命名的同一文件的多个副本(这样哈希匹配一个文件夹中的多个文件),这将失败,但这很容易解决:

        #!/bin/bash
        
        md5sum A/*.jpg B/*.jpg > index
        sed 's/\/.*//' <index | sort >sums # just delete /file
        
        # list unique files (missing from one directory)
        uniq sums | awk '{print $1}' |\
        uniq -u | while read s junk; do
            grep "$s" index | sed 's/^[a-z0-9]\{32\}  //'
        done
        

        【讨论】:

          猜你喜欢
          • 2015-07-27
          • 1970-01-01
          • 2022-10-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-15
          • 2012-04-17
          • 1970-01-01
          相关资源
          最近更新 更多