web-dev-qa-db-ja.com

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を実行して一意のハッシュを見つけると、次のようになります。

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

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

20
user2127726

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

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

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

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

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

46
John1024

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

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

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

コマンドsortには一意の出力行自体のオプションがあり、並べ替えに使用されるキーに関して行は一意です。これは、sortの強力なキー構文を使用して、行をどの部分に固有にするかを定義できることを意味します。

例については、

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

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

5
Volker Siegel

または、killdupesをインストールすることもできます。これは、存在する最後のすべての重複を破壊するための私のプログラムです!

https://github.com/batchmcnulty/killdupes

:-)

0
Batch McNulty