![我如何才能仅打印不同的重复项?](https://linux22.com/image/880508/%E6%88%91%E5%A6%82%E4%BD%95%E6%89%8D%E8%83%BD%E4%BB%85%E6%89%93%E5%8D%B0%E4%B8%8D%E5%90%8C%E7%9A%84%E9%87%8D%E5%A4%8D%E9%A1%B9%EF%BC%9F.png)
我正在尝试找出两个比较文件夹中有哪些文件。我只对比较文件名感兴趣。
由于某种原因,在命令中添加 -s 不起作用。我想重新使用列表来删除重复项,而删除“仅在”的行是浪费时间。
命令:
diff -s /folder1/folder1 /folder2/folder2
输出:
Only in /folder1/folder1: sth.pdf
Only in /folder1/folder1: sth.png
Only in /folder1/folder1: sth.txt
Files /folder1/folder1/sthe.txt and /folder2/folder2/sthe.txt are identical
Only in /folder1/folder1: sth.pdf
Only in /folder1/folder1: sth.png
Only in /folder1/folder1: sth.txt
.
.
.
有什么建议么?
答案1
我只对比较文件名感兴趣。
然后避免使用任何比较文件内容的工具,因为它只会减慢进程。
我现在想到的是比较两个目录中的文件名并仅输出公共的文件名:
comm -12 <(cd dir1; stat -c '%n' *) <(cd dir2; stat -c '%n' *)
comm -12 <([...]) <([...])
:将比较输出[...]
并[...]
仅输出两个文件中存在的行;cd dirN; stat -c '%n' *
将改变当前工作目录dirN
并输出其中文件的文件名的有序列表。
% tree
.
├── dir1
│ ├── file1
│ ├── file2
│ └── file3
└── dir2
└── file1
2 directories, 4 files
user@user-X550CL ~/tmp % comm -12 <(cd dir1; stat -c '%n' *) <(cd dir2; stat -c '%n' *)
file1
如果您需要处理文件名中的换行符,请使用以下命令:
sort -z <(cd dir1; stat --printf '%n\0' *) <(cd dir2; stat --printf '%n\0' *) | uniq -zd | tr '\0' '\n'
sort -z <([...]) <([...])
[...]
:将连接并排序和的输出[...]
;cd dirN; stat -c '%n' *
将改变当前工作目录dirN
并输出其中文件的文件名的有序列表;uniq -zd
: 将仅打印重复的行;tr '\0' '\n'
将用换行符替换 NUL 字符。
% tree
.
├── dir1
│ ├── file1
│ ├── file2
│ └── file3
└── dir2
└── file1
2 directories, 4 files
% sort -z <(cd dir1; stat --printf '%n\0' *) <(cd dir2; stat --printf '%n\0' *) | uniq -zd | tr '\0' '\n'
file1