Am Donnerstag, 3. April 2003 16:02 schrieb Kristian Koehntopp:
find . -type f -print0 | xargs -0 -i md5sum -b {} > /var/tmp/allsums
find durchsucht das aktuelle Verzeichnis "." nach Dateien vom Typ f (regular files) und druckt die Namen dieser Dateien durch ein Nullbyte getrennt. Auf diese Weise spielen Leerzeichen in Dateinamen genau wie Returns und Quotezeichen einem keine üblen Streiche.
xargs liest eine Reihe von durch Nullbytes (-0) getrennten Dateinamen auf stdin ein und führt das gegebene Kommando für jede Datei einzeln (-i) aus.
Das Kommando lautet md5sum, und berechnet eine Prüfsumme für jeden Dateinamen ({} wird durch xargs entsprechend ersetzt). md5sum behandelt die Dateien als Binärdateien (-b).
Das Resultat geht nach /var/tmp/allsums und sieht dann so aus:
kris@valiant:~> head -10 /var/tmp/allsums 000f2db5a0795df72b7d3d34dc9f4d93 *./php4/ext/pdf/CREDITS 0011638e52cc7ef1089c95961bfbf191 *./pear/PHPUnit/CVS/Repository 00153ca2870e74f3b91d37f1e1133bb7 *./pear/XML_CSSML/docs/example.php
Wir wechseln nach /var/tmp/ (cd /var/tmp).
Dort sortieren wie die Datei allsums in Place (-o Option verwendet). Die Datei ist jetzt so sortiert, daß Dateien mit gleicher Prüfsumme hintereinander in der Datei stehen.
Wir durchsuchen jetzt die Datei allsums mit awk. Wir drucken Zeilen, bei denen aufeinanderfolgende Zeilen gleiche erste Worte (Prüfsummen) haben. Das awk-Programm:
old == $1 { printf "duplicate %s\n", $2; }
{ old = $1; oldname = 2; }
Man muss das Programm von unten nach oben lesen:
Für jede Zeile merken wir uns das erste Wort der Zeile (die Checksum) in old und das zweite Wort der Zeile in oldname (den Dateinamen, vorausgesetzt, er enthält keine Leerzeichen oder Tabs oder Newlines).
Wenn die aktuelle Prüfsumme $1 gleich der Prüfsumme der Vorzeile ist, wird der aktuelle Dateiname (vorausgesetzt er enthält ...) $2 gedruckt.
Danke für die ausführliche Beschreibung. Findet man in der Liste sehr selten. Ist aber für einen Anfänger genau das richtige. Ich hoffe anderen bringt es auch ewas. Gruß L.K.