Textdateien miteinander vergleichen, die Unterschiede herausfinden und anzeigen, ja sogar der automatische Abgleich der Dateien – das alles bieten die Diffutils auf der Kommandozeile.
Die Diffutils enthalten allerlei nützliche Tools: So vergleicht Diff zwei Textdateien miteinander, verrät Ihnen die Unterschiede auf der Konsole und schreibt die Änderungsvorschläge auf Wunsch in eine Patch-Datei, mit der Sie das gewünschte Dokument vollautomatisch anpassen. Wer mit drei Textdateien hantiert, greift stattdessen zu Diff3 – wir zeigen Tipps und Tricks.
Differenziert betrachten
Das Programm Diff vergleicht zwei Textdateien (optional Dateien aus zwei Verzeichnissen) zeilenweise miteinander und verrät auf der Konsole, ob und wie diese sich unterscheiden. Um herauszufinden, ob es überhaupt Unterschiede gibt, rufen Sie das Programm zusammen mit dem Parameter -q und den beiden Textdateien auf:
$ diff -q datei1 datei2 Dateien datei1 und datei2 sind v? erschieden.
Interessieren Sie sich für die Unterschiede, lassen Sie die Option weg, und Diff schreibt seine Erkenntnisse direkt auf die Shell (Abbildung 1). Neben den Zeilen, die sich voneinander unterscheiden, sehen Sie jeweils eine etwas kryptische Angabe, die verrät, was geändert werden muss, damit die sich die beiden Dateien aufs Haar gleichen.

Abbildung 1: Diff zeigt die Unterschiede zwischen den beiden Textdateien zeilenweise auf der Konsole an.
Diese Änderungsvorschläge folgen immer demselben Schema: Neben den Zeilennummern oder einem Bereich (Zeilennummer durch Kommata getrennt), sehen Sie hier einen der drei Buchstaben a, c oder d: a steht für “append” (englisch anhängen), c für “change” (verändern) und d für “delete” (löschen). So bedeutet
9,12c9,13
aus Abbildung 1 beispielsweise, dass Sie die Zeilen 9 bis 12 der ersten Datei oder 9 bis 13 der zweiten Datei verändern müssen, damit sich die beiden Dateien gleichen. Entsprechend teilt Diff Ihnen über eine Ausdruck wie
3a,13,15
mit, dass Sie die Zeilen 13 bis 15 der zweiten Datei hinter Zeile 3 der ersten einfügen müssen. Sehen Sie die Anweisung
4-7,d8
sind die Zeilen 4 bis 7 der ersten Datei zu löschen oder entsprechend nach Zeile 8 der zweiten Datei anzuhängen, wenn Sie die zweite Datei anpassen.
TIPP
Scrollt die Diff-Ausgabe aus dem Terminal, leiten Sie diese per Pipe-Zeichen an das Programm Less oder More weiter, etwa über diff datei1 datei2 | less. Alternativ bietet es sich an, den Output in einer Datei abzulegen, beispielsweise diff datei1 datei2 > unterschiede. Wenn Sie diese nun in einem Texteditor mit Syntax-Highlighting betrachten, sehen Sie die Unterschiede farblich hervorgehoben (Abbildung 2).
Schall und Rauch
Enthalten die beiden Vergleichskandidaten viele leere Zeilen an unterschiedlichen Stellen, bläht das den Diff-Output unnötig auf. Dass das Programm Leerzeilen ignorieren soll, teilen Sie daher über einen weiteren Parameter (-B) mit.
Ebenso gibt es verschiedene Optionen, die sich mit Leerzeichen beschäftigen. So bringen Sie Diff dazu, entweder Tabulatoren (-E), einfache Leerzeichen (-b) oder sämtliche Leerzeichen (-w) zu ignorieren. Wer keinen Wert auf die Unterscheidung von Groß- und Kleinschreibung legt, teilt Diff dieses über die Option -i mit.
Im richtigen Kontext
Das Programm Diff bietet weitere Aufrufparameter, welche die Ausgabe im Zweifelsfall besser lesbar machen:
diff -c datei1 datei2
bringt etwas mehr Format und standardmäßig drei Zeilen Kontext in den Output. Soll es noch mehr Rahmen sein, geben Sie die Zeilenanzahl hinter der Option -C an:
diff -C 5 datei1 datei2
Diff kennzeichnet die erste Datei mit Sternchen, die zweite mit Bindestrichen. Als Erstes sehen Sie die Namen der beiden Dateien sowie das Datum der letzten Änderung:
* datei1 2006-10-04 00:11? :09.000000000 +0200 — datei2 2006-10-04 03:05? :03.000000000 +0200
Die weitere Ausgabe ist ebenfalls nach Dateien getrennt; nach der vollständigen Ausgabe der ersten Datei sehen Sie die zweite. Zeilen, die einen Unterschied aufweisen, haben ein Ausrufezeichen vorangestellt, Dinge, die übereinstimmen, tragen keine Markierung. Neue Abschnitte tragen ein Pluszeichen, und nicht mehr vorhandene Zeilen sind entsprechend durch Minuszeichen gekennzeichnet (Listing 1).
Listing 1
* datei1 2006-10-04 00:11:09.000000000 +0200 — datei2 2006-10-04 03:05:03.000000000 +0200 * * 3,17 […] ! Heike Jurzik […] — 3,9 —- […] ! Elke Jurek […] * * 25,31 […] - Die Leiter anlegen […] — 252,256 —- […] + + Hier steht was extra!
Seite an Seite
Eine interessante Diff-Option ist weiterhin -y – das Programm präsentiert nun beide Dateien nebeneinander. Für dieses Ausgabeformat brauchen Sie ein großes Terminalfenster, und dennoch erscheinen die Zeilen oft abgehackt. Etwas übersichtlicher wird das Ganze, wenn Sie weiterhin den Parameter --suppress-common-lines einsetzen – Gemeinsamkeiten tauchen nun nicht mehr auf. Weiterhin empfiehlt sich in diesem Zusammenhang der Einsatz von -W und die Angabe der Spaltenanzahl, die Sie sehen möchten:
diff -y --suppress-common-lines ? -W 70 datei1 datei2
Flickwerk
Seine ganzen Stärken spielt Diff aus, wenn Sie nicht nur Änderungen betrachten und speichern, sondern die Dateien direkt vollautomatisch angleichen – das spart manuelles Anpassen. Für diesen Einsatzzweck bringt Diff eine eigene Option mit:
diff -u datei1 datei2 > flicken
erstellt eine Ausgabe im so genannten Unified Format. Die Ausgabe dieses Kommandos bezeichnet man auch als Patch (Flicken). Ebenso wie die im vorigen Abschnitt gezeigte Kontextoption erscheinen beide Dateien untereinander in der Ausgabe, zeigen das Datum der letzten Änderung und drei Zeilen Kontext zur besseren Orientierung. Auch hier ist es möglich, eine andere Zeilenanzahl vorzugeben. Über
diff -U 10 datei1 datei2 > flick? en
bringen Sie Diff dazu, jeweils zehn unveränderte Zeilen mit in die Ausgabe aufzunehmen.
Anschließend zücken Sie Nadel und Faden und bringen den Flicken an. Dazu dient das Programm Patch auf der Kommandozeile. Zur Sicherheit übergeben Sie als Aufrufparameter weiterhin -b, so dass Patch eine Sicherungskopie der Originaldatei anlegt. Über den Operator < lesen Sie die Datei mit dem Flicken ein:
$ patch -b < flicken patching file datei1
Als Backup finden Sie darüber hinaus das Original von datei1 mit der Endung .orig.
Rundumschlag
Rufen Sie Diff zusammen mit zwei Verzeichnisnamen auf, vergleicht das Programm jede Datei, die in beiden Ordnern auftaucht. Alternativ übergeben Sie Diff einen Dateinamen und einen Verzeichnisnamen, und das Tool sucht nach dem Namen der Datei im angegebenen Ordner und startet den Vergleich, falls es fündig wurde. Standardmäßig schweigt sich Diff aus, wenn zwei Dateien übereinstimmen; wer einen vollständigen Bericht wünscht, übergibt zusätzlich die Option -s:
$ diff -s dir1 dir2 Dateien dir1/datei1 und dir2/dat? ei1 sind identisch. diff -s dir1/datei2 dir2/datei2 6c6 < Elke Jurek — > Elke Jurzig Nur in dir1: flicken.
Um auch Unterverzeichnisse einzubinden, teilen Sie Diff über die Option -r mit, dass es rekursiv bis in den letzten Winkel vergleichen soll. Es ist ebenfalls möglich, Dateien vom Vergleich auszuschließen. Dazu geben Sie hinter dem Parameter -x in Anführungszeichen eingeschlossen eine Beschreibung für die Ausschlusskandidaten an. Wer beispielsweise alle Dateien mit der Endung .orig ausklammern möchte, schreibt:
diff -s -x "*.orig" dir1 dir2
Aller guten Dinge sind…
Die Diffutils bringen weiterhin ein Programm mit, das drei Dateien miteinander vergleicht: Diff3 heißt das Tool, und Sie rufen es zusammen mit den drei Textdateien auf (Listing 2).
Die Ausgabe unterscheidet sich vom normalen Diff-Output: In einzelnen Abschnitten, die jeweils von drei Gleichheitszeichen eingeleitet werden, präsentiert Diff3, welche der drei Dateien wo abweicht. Dabei sehen Sie entweder nur die Gleichheitszeichen, wenn sich alle drei Dateien voneinander unterscheiden, oder die Ziffern 1, 2 oder 3 – je nachdem welche der drei Dateien aus dem Rahmen fällt. Wie bei der Diff-Ausgabe, sehen Sie weiterhin Zeilennummern oder -bereiche und Angaben, ob etwas anzuhängen (a) oder zu verändern (c) ist.
Listing 2
$ diff3 datei1 datei2 datei3
====2
1:6c
3:6c
_________________________________________________________________
2:6c
Elke Jurek
[…]
====
1:14,16c
Heike Jurzik
2:10,14c
Das Programm Screen erlaubt es, mehrere virtuelle Konsolen in nur
[…]
3:14,16c
Heike Jurzig
[…]
====3
1:257a
2:255a
3:255,256c
Der gemeinsame Nenner
Diff3 kann noch mehr – angenommen, zwei Benutzer haben dieselbe Textdatei bearbeitet, können Sie Diff3 dazu verwenden, die Dateien automatisch zusammenzuführen. Dabei geben Sie im Diff3-Aufruf die Originaldatei als zweites, die beiden veränderten Dateien als erstes und drittes Argument an:
diff3 -m datei1 original datei2 ? > ausgabe
Der Parameter -m steht für “merge” (zusammenführen), und das Ergebnis leiten Sie über den >-Operator in die Datei ausgabe um. Kommt es bei der Aktion zu unlösbaren Konflikten, sehen Sie die Problemzonen in der Ausgabedatei:
<<<<<<< datei1 ||||||| original
In dem Fall greifen Sie zum Editor und passen die entsprechenden Dateien von Hand an.





