Uniq-Befehl funktioniert nicht richtig?

22

Also überprüfe ich den md5Hash meiner Dateien mit dieser Ausgabe:

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

Nach dem Ausführen find . -type f -exec md5sum '{}' ';' | uniq -w 33, um die eindeutigen Hashes zu finden, erhalte ich jedoch Folgendes:

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

Nur entweder aus meinem Verständnis, derpina.txtoder derp.txtsollte zeigen , bis da ihre Hashes gleich sind. Vermisse ich etwas? Kann mir jemand erklären, warum es so ausgibt?

user2127726
quelle
1
Herausgefunden. Anscheinend erkennt uniq wiederholte Zeilen nur, wenn sie benachbart sind. Link zur Antwort, die mir geholfen hat stackoverflow.com/questions/23114677/…
user2127726

Antworten:

48

Sie müssen sortvor verwenden uniq:

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

uniqEntfernt nur wiederholte Zeilen. Die Zeilen, die nach Wiederholungen suchen, werden nicht neu geordnet. sortmacht diesen Teil.

Dies ist dokumentiert in man uniq:

Hinweis: 'uniq' erkennt keine wiederholten Zeilen, sofern diese nicht benachbart sind. Sie können die Eingabe zuerst sortieren oder sort -u' withoutuniq 'verwenden.

John1024
quelle
uniqsollte sort -uin allen Systemen standardmäßig als Alias verwendet werden. Wenn überhaupt, muss es immer "sortiert" werden, damit es richtig funktioniert.
Devaroop
Diese Änderung würde einige Verwirrung lindern. Auf der anderen Seite uniqhat viele Funktionen nicht mit zur Verfügung sort -u. Es gibt auch Fälle, in denen man uniqohne verwenden möchte sort.
John1024,
5

Die Eingabe für uniqmuss sortiert werden. Also für den Beispielfall,

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

würde funktionieren. Das -w( --check-chars=N) macht die Zeilen nur in Bezug auf die erste Spalte eindeutig; Diese Option funktioniert in diesem Fall. Die Möglichkeiten, die relevanten Teile der Leitung zu spezifizieren, uniqsind jedoch begrenzt. Beispielsweise gibt es keine Optionen zum Festlegen der Arbeit an einigen Spalten 3 und 5, wobei Spalte 4 ignoriert wird.

Der Befehl sortverfügt über eine Option für eindeutige Ausgabezeilen selbst, und die Zeilen sind in Bezug auf die zum Sortieren verwendeten Schlüssel eindeutig. Dies bedeutet, dass wir die leistungsstarke Schlüsselsyntax von verwenden können sort, um zu definieren, in welchem ​​Teil die Zeilen eindeutig sein sollen.

Für das Beispiel

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

gibt genau das gleiche Ergebnis, aber das sortTeil ist flexibler für andere Zwecke.

Volker Siegel
quelle