Beim Kopieren kompletter Verzeichnisse von einem Ort an einen Anderen, eventuell sogar per Netz, ist es manchmal schwierig, direkt zu erkennen, ob alle Dateien korrekt übertragen wurden, z.B. weil der Datentransfer zwischendurch unterbrochen worden war. Falls die Dateigrößen im Quell- und Zielverzeichnis unterschiedlich sind, ist eine Fehlererkennung damit sehr einfach möglich. Es kann allerdings auch sein, dass die Dateien in beiden Verzeichnissen gleichgroß sind, weshalb eine Überprüfung des Dateiinhaltes notwendig ist. Im folgenden beschreibe ich zwei Möglichkeiten, mit denen man eventuelle Unterschiede feststellen kann.
In beiden Fällen kann ein transparentes
Terminal.app-Fenster (Fenstereinstellungen -> Farbe -> Schieberegler
Transparenz) durchaus nützlich sein.
Vergleich der MD5-Checksummen
Wechseln sie im Terminal mit
cd ins Quellverzeichnis und lassen sie mit
md5 * die MD5-Checksummen aller Dateien (selbst in den Unterverzeichnissen) berechnen. Öffnen sie anschließend ein weiteres, größtenteils transparentes, Terminalfenster, wechseln sie ins Zielverzeichnis und berechnen dort ebenfalls die Checksummen. Wenn sie die beiden Terminalfenster direkt übereinanderlegen, können sie Unterschiede in den Checksummen direkt erkennen.
Hintergrund dessen ist die Tatsache, dass die von MD5 errechnete Summe bereits für ein einzelnes, unterschiedliches Byte einen anderen Wert hat. Somit sind beide Dateien gleich, sofern die MD5-Checksumme gleich ist. Für weitere Details zu MD5 verweise ich auf den oben verlinkten
Wikipedia-Artikel über MD5.
Statt mit zwei übereinander liegenden Fenstern können sie selbstverständlich auch die Summen in Dateien schreiben lassen und diese Dateien anschließend vergleichen:
md5 /Pfad/zum/Quellverzeichnis/* > quelle.txt
md5 /Pfad/zum/Zielverzeichnis/* > ziel.txt
diff quelle.txt ziel.txt
Vorteil dieses Beispiels ist, dass es auch dann anwendbar ist, wenn die zu vergleichenden Dateien nicht oder nur teilweise übertragen werden sollen, z.B. um zu ermitteln, ob die aktuelle Version einer Datei bereits auf einen Webserver hochgeladen wurde.
Falls sie das Programm
md5sum von
Fink installiert haben, können sie sich in obigem Beispiel ein Stück Arbeit ersparen:
md5sum /Pfad/zum/Quellverzeichnis/* > quelle.txt
md5sum -c quelle.txt /Pfad/zum/Zielverzeichnis/*
Vergleich aller Dateiinhalte
Wenn sie nicht nur wissen möchten, ob die Quell- und Zieldateien unterschiedlich sind, sondern welches diese Unterschiede sind, müssen sie das bewährte Unix-Programm
diff anwenden:
diff /Pfad/zum/Quellverzeichnis/ /Pfad/zum/Zielverzeichnis/
Die Ausgabe dieses Befehls gibt an, welche Teile der Dateien herausgenommen werden müssen (gekennzeichnet durch < am Zeilenanfang) und welche hinzugefügt werden müssen (> am Anfang der Zeile), um aus den Quell- die Zieldateien zu erhalten. Der Vorteil an dieser Methode ist, dass diff auch feststellt, wenn nicht alle Dateien übertragen worden sind oder sich im Zielverzeichnis zusätzliche Dateien befinden.
Falls es tatsächlich Unterschiede zwischen Quelle und Ziel geben sollte, brauchen sie bei der Verwendung von diff und
patch lediglich eine einzige Datei, einen Patch („Flicken“) zu übertragen:
diff -Naur /Pfad/zum/Quellverzeichnis/ /Pfad/zum/Zielverzeichnis/ > quelle-ziel.diff
Und dann
im Zielverzeichnis patch -p0 < quelle-ziel.diff. Bei der Übertragung des Patches per Netz können sie durch Kompression (im Folgenden
bz2) dieser Datei noch ein wenig Zeit und Daten sparen:
diff -Naur /Pfad/zum/Quellverzeichnis/ /Pfad/zum/Zielverzeichnis/ | bzip2 > quelle-ziel.diff.bz2
und
bunzip quelle-ziel.diff.bz2 | patch -p0
Vergleich mit FileMerge.app
In Analogie zur Anwendung von diff können sie auch das Developer Tool
opendiff benutzen, welches die Unterschiede zwischen den Dateien mit FileMerge anzeigt:
opendiff /Pfad/zum/Quellverzeichnis/ /Pfad/zum/Zielverzeichnis/
Wie der Name FileMerge vermuten lässt, können sie damit auch die Änderungen an den Zieldateien, die nötig sind, um die Quelldateien zu erhalten, vornehmen lassen.
[
aplysia: Hint wurde von
Apfelmännchen erweitert.]