使用bash在两个文件夹中查找不匹配的文件
我有两个文件夹——FolderA和FolderB——每个文件夹都包含数千个文件,这些文件在扩展名之前的名称应该完全相同。一个文件夹包含扩展名为.jpg的文件,另一个文件夹包含扩展名为.txt的文件 我的目标是查找其中一个文件中的任何文件,而不是另一个文件中的任何文件。例如,如果FolderA包含:使用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
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 ...