我正在尝试找出两个比较文件夹中有哪些文件。我只对比较文件名感兴趣。
由于某种原因,在命令中添加 -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