【问题标题】:Find mismatching files in two folders with bash使用 bash 在两个文件夹中查找不匹配的文件
【发布时间】:2019-05-29 13:35:52
【问题描述】:

我有两个文件夹 - FolderA 和 FolderB - 每个文件夹都包含数千个文件,这些文件应该在扩展名之前 以完全相同的名称命名。一个文件夹包含扩展名为 .jpg 的文件,另一个包含扩展名为 .txt 的文件。

我的目标是找到在一个文件中但不在另一个文件中的任何文件。例如,如果 FolderA 包含:

foo.jpg
bar.jpg
baz.jpg

并且 FolderB 包含:

foo.txt
baz.txt
qux.txt

脚本应该返回:

FolderA/bar.jpg
FolderB/qux.txt

如何使用 bash 通过输入两个单独的目录来创建这样的输出?我希望以某种方式修改diff 命令,该命令将提供Only in ... 输出,但在这种情况下,由于扩展名不同,diff 将输出所有文件

diff -rq FolderA FolderB

【问题讨论】:

  • 是的,您是否尝试过任何方法并遇到了具体问题?
  • 我只试过diff命令

标签: bash shell unix


【解决方案1】:

这会按照您的要求执行,但会在 3 列中报告结果 - 第一个目录独有的列、第二个目录独有的列以及两者共有的列:

comm <(cd FolderA && printf "%s\n" *.jpg | sed 's/.jpg$//') <(cd FolderB && printf "%s\n" *.txt | sed 's/.txt$//')

样本输出

bar
        baz
        foo
    qux

您可以使用以下命令禁止打印第 3 列:

comm -3 ...

【讨论】:

    【解决方案2】:

    假设您的文件名没有特殊字符(如 ./),这个 awk “单线”将完成这项工作:

    awk -F'[./]' 'NR==FNR{a[$(NF-1)]=$0;next}
            $(NF-1) in a{delete a[$(NF-1)];next}
            {print}END{for(x in a)print a[x]}' 
           <(find DIR1/ -name *.jpg) 
           <(find DIR2/ -name *.txt)
    
    • 您将 DIR1DIR2 替换为您的真实目录名称
    • 如果您的文件名确实包含特殊字符,您需要引用文件名或删除后缀。但这是实现的细节,并不难。此答案为您指明了解决问题的方向。

    【讨论】:

    • 爱它!一个只有 4 个换行符的“单行”:-)
    【解决方案3】:

    如果您的diff -rq 输出很好,但您只是希望它的格式不同,您可以使用sed 更改输出:

    diff -rq dir1 dir2 | sed 's/Only in //;s/: /\//' | sort 
    

    这是假设您的目录名称中没有 :(冒号空格)。

    【讨论】:

      猜你喜欢
      • 2016-11-23
      • 1970-01-01
      • 2019-11-11
      • 2015-02-25
      • 1970-01-01
      • 1970-01-01
      • 2017-07-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多