我有两个文件夹-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
答案 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)
DIR1
和DIR2
答案 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