Mehrere Versionen derselben Datei werfen die Frage auf, ob diese sich unterscheiden – zumindest für Textdateien bringt die Shell alle Tools mit, die Sie brauchen, um diese Frage zu beantworten.
Es ist schnell passiert: Sie beginnen auf Rechner A, an einer Datei zu arbeiten, dann kopieren Sie die Datei für eine längere Bahnfahrt auf das Notebook B und ändern dort Teile der Datei. Irgendwann kopieren Sie die zweite Fassung auf Rechner A zurück, und nun liegen dort zwei Versionen der Datei. Welche der beiden aktueller ist, können Sie eventuell am Dateidatum erkennen – das hängt davon ab, wie Sie die Dateien zwischen den PCs kopiert haben. Aber für einen Vergleich müssten Sie beide Versionen im Editor öffnen und Absatz für Absatz, Wort für Wort nach Unterschieden suchen.
Diese mühsame Aufgabe nehmen Ihnen in der Shell gleich mehrere Tools ab – im Folgenden geht es um diff, wdiff und das selbst gebastelte Tool ddiff.
“diff” für Programmierer
Ein Klassiker in der Welt der Unix-/Linux-Tools ist das Programm diff, das zwei Dateien zeilenweise vergleicht. Findet es Unterschiede, gibt es diese in einer Form aus, die andere Tools gut weiter verarbeiten können. Für den menschlichen Leser ist das Format eher gewöhnungsbedürftig, dank grafischen Frontends wie tkdiff oder kdiff3 aber handhabbar.
Als Beispiel für die Ausgabe von diff dienen hier die folgenden zwei Dateien v1.txt und v2.txt:
$ cat v1.txt Erste Zeile Zweite Zeile Dritte Zeile Vierte Zeile Fuenfte Zeile $ cat v2.txt Erste Zeile Zweite Zeile, geaendert Dritte Zeile Fuenfte Zeile Sechste Zeile
Sie sehen auf Anhieb, was sich von v1.txt zu v2.txt geändert hat: Die zweite Zeile wurde verändert, die vierte ganz entfernt und schließlich am Ende eine neue (sechste) Zeile ergänzt. Rufen Sie nun diff mit den beiden Dateinamen als Argumenten auf, erhalten Sie folgende Ausgabe:
$ diff v1.txt v2.txt 2c2 < Zweite Zeile --- > Zweite Zeile, geaendert 4d3 < Vierte Zeile 5a5 > Sechste Zeile
Die Zeilen, die mit einem Kleiner- oder Größer-Zeichen beginnen, drücken aus, dass v2.txt aus v1.txt entstanden ist, indem eine Zeile entfernt (<) oder hinzugefügt (>) wurde; die Änderung einer Zeile besteht aus der Kombination von Entfernen und Hinzufügen, wie das Beispiel der geänderten zweiten Zeile zeigt. Über jeder solchen Änderung steht in der diff-Ausgabe noch, an welcher Stelle sie stattgefunden hat; die Buchstaben c, d und a stehen für change (Änderung), deletion (Löschung) und addition (Hinzufügung). Bei der Änderung befindet sich zwischen dem alten und dem neuen Text eine Trennzeile, die aus drei Minuszeichen besteht.
Wer lieber ein grafisches Tool verwendet, kann eines der beiden schon erwähnten Programme tkdiff oder kdiff3 nachinstallieren. Für die Darstellung der Unterschiede verwenden beide Tools farbige Unterlegungen (Abbildung 1), was z. B. für Quellcode- oder Konfigurationsdateien gut funktioniert, bei Textdateien mit umfangreichen Absätzen (die lange Zeilen ohne Umbrüche bilden) aber nicht hilfreich ist – in der Ansicht ist jeweils nur der Anfang jedes Absatzes sichtbar.

Abbildung 1: Das “diff”-Frontend “tkdiff” zeigt Änderungen übersichtlicher an, eignet sich aber nicht für Textdateien mit langen Absätzen.
Zu diff gehört, zumindest für Programmierer, immer auch das Tool patch, denn damit können Sie aus v1.txt und der diff-Ausgabe die Datei v2.txt rekonstruieren. Darum ist es bei Updates möglich, nur die Änderungen am Quellcode (im Vergleich zu einer bereits vorhandenen älteren Version) herunterzuladen, diese mit patch anzuwenden und ab sofort mit der neuen Version zu arbeiten. Der Ausdruck “einen Patch anwenden” kommt hierher.
“wdiff” für Autoren
Wenn Sie Notizen oder längere Texte in einem Editor erstellen, hilft Ihnen diff nur eingeschränkt beim Vergleich zweier Dateiversionen. Hier kommt das zweite Tool, wdiff, ins Spiel: Es vergleicht Wörter (word diff). Wendet man es auf die Beispieldateien von oben an, ergibt sich:
$ wdiff v1.txt v2.txt
Erste Zeile
Zweite [-Zeile-] {+Zeile, geaendert+}
Dritte Zeile
[-Vierte Zeile-]
Fuenfte {+Zeile
Sechste+} Zeile
Auch hier können Sie die Änderungen von der ersten zur zweiten Dateiversion gut verfolgen, die Teile in eckigen Klammern und Minuszeichen wurden entfernt, die Teile in geschweiften Klammern und Pluszeichen ergänzt. Doch wdiff kann viel mehr – es kommt z. B. damit klar, wenn Sie in einer Datei nur Zeilenumbrüche ändern, und es zeigt nicht nur, in welchen Zeilen es Änderungen gibt, sondern gibt die exakten Stellen innerhalb der Zeile aus, die Sie verändert haben. Das funktioniert auch mit sehr langen Zeilen (Absätzen) gut.
Anders als diff gibt wdiff eine vollständige Version der zweiten Datei und dazu die Änderungsmarkierungen aus. Das heißt: Auch wenn Sie identische Dateien vergleichen, sehen Sie diese komplett in der Ausgabe (dann ohne Markierungen). diff gibt bei identischen Dateien gar nichts aus.
Variante “ddiff”
Das wdiff-Tool können Sie über Aufrufparameter konfigurieren, so dass es statt der Klammern andere Zeichen als Anfangs- und Endmarkierungen für geänderte Textstellen verwendet. Im folgenden kleinen Skript, das Sie z. B. als ddiff im Ordner ~/bin/ speichern können, legen die Optionen -w, -x, -y und -z vier Escape-Sequenzen fest, die im Terminalfenster eine andere Farbe aktivieren:
#!/bin/bash wdiff -n -w $'\033[30;41m' -x $'\033[0m' -y $'\033[30;42m' -z $'\033[0m' $@ | recode latin1..utf8 | less -R
Das Skript basiert auf einem Beispiel aus der wdiff-Dokumentation [1], verwendet aber in der Pipeline zusätzlich recode, um die Textkodierung von latin1 auf utf8 umzustellen – diesen Teil, also den Block
| recode latin1..utf8
(inklusive einleitendem Pipe-Zeichen “|”) können Sie weg lassen. In der Redaktion wird diese Umkodierung benötigt, weil Artikeltexte latin1-kodiert sind, moderne Linux-Distributionen in der Shell aber die UTF-8-Kodierung einsetzen.
Die Option -R sorgt dafür, dass less die Escape-Sequenzen für den Farbwechsel von less an das Terminalfenster weiter gibt (Abbildung 2) – ohne die Option würden Sie stattdessen Ausgaben der Form ESC[30;41m (und keine Farben) erhalten. Dieser less-Trick ist auch in anderen Zusammenhängen nützlich, etwa bei der farbigen Verzeichnisausgabe mit ls:
ls -l --color | less -R
leitet die Ausgabe an less weiter, inklusive Farben.

Abbildung 2: “ddiff” zeigt sehr übersichtlich durch rote und grüne Markierungen, welche Worte entfernt und ergänzt wurden.
Haben Sie den Ordner ~/bin in Ihrem Pfad ($PATH), können Sie ddiff wie die übrigen Tools aufrufen, also z. B. mit ddiff v1.txt v2.txt. Wenn das nicht klappt, müssen Sie das Verzeichnis noch mit export PATH=$PATH:~/bin ergänzen.
Fazit
Die beiden diff-Tools sind nützlich, vor allem, wenn man weiß, welche Variante für welchen Zweck geeignet ist. Mit ein wenig Experimentieren können die Programme einen Beitrag zur Ordnung auf dem PC schaffen und damit die im Artikel ab Seite 54 vorgestellten Programme ergänzen.
Infos
[1] Beispielaufrufe von wdiff: http://www.gnu.org/software/wdiff/manual/html_node/wdiff-Examples.html

