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

使用bash在两个文件夹中查找不匹配的文件,bash,shell,unix,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

我有两个文件夹——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
命令,该命令将仅在…输出中提供
,但在这种情况下,由于扩展名不同,
diff
将输出所有文件

diff -rq FolderA FolderB

假设您的文件名没有特殊字符(如
/
),此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)
awk-F'[./]''NR==FNR{a[$(NF-1)]=$0;next}
$(NF-1)在{删除a[$(NF-1)];下一个}
{print}END{for(a中的x)print a[x]}'

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

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

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

这会满足您的要求,但会在3列中报告结果-第一个目录唯一的列、第二个目录唯一的列和两个目录共有的列:

comm <(cd FolderA && printf "%s\n" *.jpg | sed 's/.jpg$//') <(cd FolderB && printf "%s\n" *.txt | sed 's/.txt$//')
您可以使用以下命令禁止打印第3列:

comm -3 ...

是的,你有没有试过什么,遇到过具体的问题?我只试过
diff
命令。我的答案或其他任何人解决了你的问题吗?如果是这样,请考虑接受它作为您的答案-点击空心蜱/支票旁边的选票计数。如果没有,请说出什么不起作用,以便我或其他人可以进一步帮助您。谢谢爱死它了!“一行”中只有4个换行符:-)
comm -3 ...