uniq命令无法正常工作?

所以我用我的输出检查我的文件的md5哈希:

 657cf4512a77bf47c39a0482be8e41e0 ./dupes2.txt 657cf4512a77bf47c39a0482be8e41e0 ./dupes.txt 8d60a927ce0f411ec94ac26a4785f749 ./derpina.txt 15f63928b8a1d5337137c38b5d66eed3 ./foo.txt 8d60a927ce0f411ec94ac26a4785f749 ./derp.txt 

但是,运行后find . -type f -exec md5sum '{}' ';' | uniq -w 33 find . -type f -exec md5sum '{}' ';' | uniq -w 33 find . -type f -exec md5sum '{}' ';' | uniq -w 33找到我得到的独特哈希:

 657cf4512a77bf47c39a0482be8e41e0 ./dupes2.txt 8d60a927ce0f411ec94ac26a4785f749 ./derpina.txt 15f63928b8a1d5337137c38b5d66eed3 ./foo.txt 8d60a927ce0f411ec94ac26a4785f749 ./derp.txt 

根据我的理解, derpina.txtderp.txt只有一个应该出现,因为它们的哈希是相同的。 我错过了什么吗? 任何人都可以告诉我为什么它这样输出?

你需要在uniq之前使用sort

 find . -type f -exec md5sum {} ';' | sort | uniq -w 33 

uniq只删除重复的行。 它没有重新排序寻找重复的行。 sort做那部分。

这在man uniq有记载:

注意:’uniq’不会检测重复的行,除非它们相邻。 您可能希望先对输入进行排序,或使用sort -u' without uniq’。

uniq的输入需要排序。 因此,对于示例案例,

 find . -type f -exec md5sum '{}' ';' | sort | uniq -w 33 

会工作。 -w--check-chars=N )仅使第一列的行唯一; 此选项适用于此情况。 但是为uniq指定线的相关部分的可能性是有限的。 例如,没有选项指定在第3列和第5列上工作,忽略第4列。

命令sort有一个唯一输出行本身的选项,并且这些行对于用于排序的键是唯一的。 这意味着我们可以利用sort的强大关键语法来定义行应该是uniq的哪个部分。

例如,

 find . -type f -exec md5sum '{}' ';' | sort -k 1,1 -u 

给出了相同的结果,但sort部分对于其他用途更灵活。

或者你可以安装killdupes,我的程序可以销毁每一个最后复制的副本!

https://github.com/batchmcnulty/killdupes

🙂