uniqコマンドが正しく機能していませんか?


22

だから私はmd5これを出力としてファイルのハッシュをチェックしています:

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

しかし、find . -type f -exec md5sum '{}' ';' | uniq -w 33一意のハッシュを見つけるために実行した後、私はこれを取得します:

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

私の理解からは、いずれか一方のみの1 derpina.txtかは、derp.txtそのハッシュが同じであるため、最大表示されなければなりません。何か不足していますか?なぜそれがこのように出力されるのかについて私を啓発できますか?


1
理解した。明らかに、uniqは、隣接していない限り、繰り返される行を検出しません。私に助けた答えへのリンクstackoverflow.com/questions/23114677/...
user2127726

回答:


48

sort前に使用する必要がありますuniq

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

uniq繰り返される行のみを削除します。繰り返しを探す行の順序は変更しません。 sortその部分を行います。

これは以下で文書化されていman uniqます:

注: 'uniq'は、隣接していない限り、繰り返される行を検出しません。最初に入力をソートするか、sort -u' withoutuniq 'を使用することができます。


uniqsort -uすべてのシステムでデフォルトとしてエイリアスされる必要があります。正しく動作するためには、「ソート」が常に必要な場合があります。
デバループ

この変更により、混乱が軽減されます。一方、uniqでは使用できない多くの機能がありますsort -u。また、uniqなしで使用したい場合もありますsort
John1024

5

の入力をuniqソートする必要があります。したがって、例の場合、

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

動作します。-w--check-chars=N)のみ、最初の列に関してユニークなラインを作ります。この場合、このオプションは機能します。ただし、行の関連部分を指定する可能性uniqは限られています。たとえば、列4を無視して、列3および5での作業を指定するオプションはありません。

このコマンドにsortは、一意の出力行自体のオプションがあり、行はソートに使用されるキーに関して一意です。つまり、強力なキー構文を使用してsort、行をuniqにする必要がある部分を定義できます。

例については、

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

同じ結果が得られますが、このsort部分は他の用途に対してより柔軟です。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.