我如何才能仅打印不同的重复项?

我如何才能仅打印不同的重复项?

我正在尝试找出两个比较文件夹中有哪些文件。我只对比较文件名感兴趣。

由于某种原因,在命令中添加 -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

相关内容