使用bash在两个文件夹中查找不匹配的文件

时间:2019-05-29 13:35:53

标签: bash shell unix

我有两个文件夹-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

3 个答案:

答案 0 :(得分:1)

假设您的文件名没有特殊字符(例如./),则该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
  • 如果文件名确实包含特殊字符,则需要引用文件名或仅切掉后缀。但这是实现的细节,并不难。该答案向您显示了解决问题的方向。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

这可以满足您的要求,但是会在3列中报告结果-第一个目录特有的结果,第二个目录特有的结果,以及这两个目录共同的结果:

-e

示例输出

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

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

bar
        baz
        foo
    qux