On Thu, Apr 03, 2003 at 03:07:24PM +0200, Lutz Kasper wrote:
find . -type f -print0 | xargs -0 -i md5sum -b {} > /var/tmp/allsums cd /var/tmp sort -o allsums allsums awk 'old == $1 { printf "duplicate %s\n", $2 }; { old = $1; oldname = $2 }' allsums
Muss ich mal ausprobieren. Klingt ganz gut, nur die Übersetzung der einzelnen Befehle muss ich mir aus dem Internet raussuchen. Alle sind mir noch nicht klar. Aber danke für die Mühe.
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 003058ee7385fe0ea312ca531398d4ca *./php4/win32/pwd.h 00360c62a05fdfff7088eeb424b61d27 *./pear/PHPDoc/renderer/html/CVS/Repository 004423db0f39104388e9c2eaf8135616 *./pear/HTML_TreeMenu/TreeMenu.js 00452b850b9139534e39c6b5348477c2 *./pear/HTML_Template_Flexy/Flexy/CVS/Entries 00542db62e9cdcf0c3406787d8f08e18 *./k3b-0.7.5/src/audio/.deps/k3baudiotrackdialog.Plo 0056321cc3f3c1964c03f3962da694ea *./php4/ext/mcrypt/CREDITS 0063d3306b15911132d6fa07ca982fee *./pear/HTML_OOH_Form/examples/xml/form_fulladress.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. Kristian