uniq 命令无法正常工作?

use*_*726 29 command-line bash uniq

所以我md5用这个作为我的输出检查我的文件的哈希值:

657cf4512a77bf47c39a0482be8e41e0  ./dupes2.txt
657cf4512a77bf47c39a0482be8e41e0  ./dupes.txt
8d60a927ce0f411ec94ac26a4785f749  ./derpina.txt
15f63928b8a1d5337137c38b5d66eed3  ./foo.txt
8d60a927ce0f411ec94ac26a4785f749  ./derp.txt
Run Code Online (Sandbox Code Playgroud)

但是,在运行find . -type f -exec md5sum '{}' ';' | uniq -w 33找到唯一的哈希后,我得到了这个:

657cf4512a77bf47c39a0482be8e41e0  ./dupes2.txt
8d60a927ce0f411ec94ac26a4785f749  ./derpina.txt
15f63928b8a1d5337137c38b5d66eed3  ./foo.txt
8d60a927ce0f411ec94ac26a4785f749  ./derp.txt
Run Code Online (Sandbox Code Playgroud)

根据我的理解,由于它们的哈希值相同,因此只有其中一个derpina.txtderp.txt应该出现。我错过了什么吗?任何人都可以启发我为什么它会输出这样的结果?

Joh*_*024 69

您需要使用sort之前uniq

find . -type f -exec md5sum {} ';' | sort | uniq -w 33
Run Code Online (Sandbox Code Playgroud)

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

这记录在man uniq

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

  • 在所有系统中,“uniq”默认应别名为“sort -u”。如果有的话,它总是需要“排序”才能正常工作。 (3认同)
  • 这一改变会减少一些混乱。另一方面,“uniq”具有“sort -u”所不具备的许多功能。另外,在某些情况下,人们想使用“uniq”而不使用“sort”。 (2认同)

Vol*_*gel 7

uniq需要对输入进行排序。所以对于示例案例,

find . -type f -exec md5sum '{}' ';' | sort | uniq -w 33
Run Code Online (Sandbox Code Playgroud)

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

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

例如,

find . -type f -exec md5sum '{}' ';' | sort -k 1,1 -u
Run Code Online (Sandbox Code Playgroud)

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