polecenie uniq nie działa poprawnie?

22

Więc sprawdzam md5 skrót moich plików za pomocą tego jako mojego wyjścia:

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

Jednak po uruchomieniu find . -type f -exec md5sum '{}' ';' | uniq -w 33 aby znaleźć unikalne skróty, otrzymuję to:

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

Z mojego zrozumienia, albo tylko jedna derpina.txtlub derp.txtpowinny być wyświetlane, ponieważ ich hashe są takie same. Czy coś brakuje? Czy ktoś może mnie oświecić, dlaczego tak to wygląda?

użytkownik2127726
źródło
1
Domyśliłam się. Najwyraźniej uniq nie wykrywa powtarzających się linii, chyba że sąsiadują ze sobą. Link do odpowiedzi, która pomogła mi stackoverflow.com/questions/23114677/…
user2127726

Odpowiedzi:

48

Musisz użyć sortprzed uniq:

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

uniqusuwa tylko powtarzające się linie. Nie porządkuje wierszy szukających powtórzeń. sortrobi tę część.

Jest to udokumentowane w man uniq:

Uwaga: „uniq” nie wykrywa powtarzających się linii, chyba że sąsiadują ze sobą. Możesz najpierw posortować dane wejściowe lub użyć sort -u' withoutuniq '.

John1024
źródło
uniqpowinien być sort -udomyślnie aliasowany we wszystkich systemach. Jeśli w ogóle zawsze potrzebuje „sortowania”, aby działał poprawnie.
Devaroop
Ta zmiana zmniejszyłaby pewne zamieszanie. Z drugiej strony uniqma wiele funkcji niedostępnych z sort -u. Są też przypadki, w których chce się używać uniqbez sort.
John1024
5

Dane wejściowe uniqmuszą zostać posortowane. W tym przypadku

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

pracowałbym. -w( --check-chars=N) Pozwala linie unikalne wyłącznie w odniesieniu do pierwszej kolumnie; Ta opcja działa w tym przypadku. ale możliwości określenia odpowiednich części linii uniqsą ograniczone. Na przykład nie ma opcji określających działanie na niektórych kolumnach 3 i 5, ignorując kolumnę 4.

Polecenie sortma opcję dla samych unikatowych linii wyjściowych, a linie są unikatowe w odniesieniu do kluczy używanych do sortowania. Oznacza to, że możemy skorzystać z potężnej składni klawiszy, sortaby określić, w której części wiersze powinny być uniq.

Na przykład

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

daje ten sam wynik, ale sortczęść jest bardziej elastyczna do innych zastosowań.

Volker Siegel
źródło