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.txt
或derp.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
部分对于其他用途更灵活。