Finden Sie die Unterschiede – die Programme diff und diff3 aus dem Paket diffutils helfen beim Vergleichen von Textdateien, zeigen eventuelle Abweichungen auf der Kommandozeile an und gleichen die Dateien auf Wunsch vollautomatisch an.
Zu Befehl
Auch wenn sich viele Dinge bequem über grafische Oberflächen wie KDE oder GNOME regeln lassen – wer sein Linux-System richtig ausreizen möchte, kommt um die Kommandozeile nicht herum. Abgesehen davon gibt es auch sonst viele Situationen, wo es gut ist, sich im Befehlszeilendschungel ein wenig auszukennen.
Wer Konfigurationsdateien und andere ASCII-Texte häufig bearbeitet und die alten Versionen aufbewahrt, erwirbt so mit der Zeit eine Sammlung sehr ähnlicher Dateien. Da sind Tools gefragt, die schnell die Unterschiede zusammenfassen, – etwa die Dienstprogramme aus dem Paket diffutils:
diffvergleicht zwei Textdateien,diff3gibt Unterschiede zwischen drei Dateien aus,sdiffführt zwei Dateien interaktiv zusammen,- und
cmpvergleicht binäre Dateien.
Wir zeigen, wie Sie mit den Tools diff und diff3 oder Ihrem Lieblings-Editor den Unterschieden auf die Schliche kommen.
Differenziert
Das Programm diff vergleicht zwei Textdateien und gibt das Ergebnis auf der Konsole aus. Um einfach nur herauszufinden, ob sich zwei Dateien grundsätzlich unterscheiden, verwenden Sie den Aufruf diff -q datei1.txt datei2.txt. Das Programm meldet entweder Dateien datei1.txt und datei2.txt sind verschieden oder schweigt. Wird die Option weggelassen, erscheinen die Unterschiede auf der Konsole:
huhn@asteroid:~$ diff datei1.txt datei2.txt 4c4 < sonst viele Situationen, wo es gut ist, — > sonst etliche Situationen, wo es gut ist,
4c4 heißt, dass sich die beiden Dateien in Zeile 4 unterscheiden. Das c steht dabei für englisch “change”: Zeile 4 müssten Sie verändern, um beide Dateien anzugleichen. Danach folgen eine Ausgabe der vierten Zeile der ersten Datei, eine Trennlinie --- und dann die gleiche Zeile aus der zweiten Datei.
Weiterhin zeigt diff neu hinzugekommene Abschnitte an:
5a6,10 > > Zu den diffutils gehören die Programme diff (zum > Vergleichen von Textdateien), diff3 (gibt Unterschiede > zwischen drei Dateien aus), sdiff […]
5a6,10 bedeutet, dass hinter Zeile 5 der ersten Datei die Zeilen 6–10 aus der zweiten Textdatei angehängt (a für englisch “append”) werden müssen, damit beide Dateien übereinstimmen.
Gerade beim Vergleichen längerer Dateien scrollt die Ausgabe schnell aus dem Fenster heraus. Wem das zu unübersichtlich ist, der kann den Output entweder von einem Pager wie less oder more seitenweise anzeigen lassen (diff datei1.txt datei2.txt | less) oder in eine Datei umleiten (diff datei1.txt datei2.txt > unterschiede.diff). Praktisch: Der Editor Vim hat eine eigene Syntax-Highlighting-Datei für solche diff-Dateien und stellt die Unterschiede farbig dar (Abbildung 1). Daneben enthält das Vim-Paket auch das Programm Vimdiff (Kasten 1), das bis zu vier verschiedene Dateien gleichzeitig vergleichen und verarbeiten kann. Wer lieber mit (X)Emacs arbeitet, findet in Kasten 2 ein paar Hinweise zu Ediff.
Mehr Kontext
Die diff-Ausgabe wird übersichtlicher, wenn Sie den Parameter -c anhängen. Zunächst sehen Sie in der Ausgabe das Datum der letzten Änderung für beide Dateien. Die erste Datei (mit Sternchen markiert) erscheint zuerst. Jede Zeile, in der diff einen Unterschied finden, beginnt mit einem Ausrufezeichen. Zeilen, die in beiden Dateien übereinstimmen, erscheinen ohne Markierung. Erst nach der vollständigen Ausgabe der ersten Textdatei folgt die zweite (durch Striche eingeleitet) – der Vergleich kann bei längeren Dateien etwas schwieriger werden.
Die Kontext-Option sorgt dafür, dass diff neu hinzugekommene Abschnitte mit einem Pluszeichen versieht. Ein Minuszeichen hingegen weist auf nicht mehr vorhandene Zeilen hin.
Zu dritt
Um gleich drei Dateien miteinander zu vergleichen, verwenden Sie das Programm diff3. Die Ausgabe sieht hier ein bisschen anders aus als bei diff. Am besten verdeutlicht man sich das an einem kleinen Beispiel: Listing 1 zeigt drei kurze Textdateien und den Output des diff3-Kommandos.
Listing 1
Vergleich zu dritt
datei1.txt:
Huhn Hahn Küken
datei2.txt:
Huhni Hahn Küken
datei3.txt:
Huhn Hahn Küken Frosch
diff3-Ausgabe:
huhn@asteroid:~$ diff3 datei1.txt datei2.txt datei3.txt ====2 1:1c 3:1c Huhn 2:1c Huhni ====3 1:3a 2:3a 3:4c Frosch
Die Darstellung der jeweiligen Unterschiede leitet diff3 durch drei =-Zeichen ein, gefolgt von 1, 2 oder 3 – je nachdem, welche der drei Dateien abweicht. Erscheinen die Gleichheitszeichen ohne Nummer, unterscheiden sich alle drei Dateien.
In Listing 1 sehen Sie, dass die zweite Datei (====2) Unterschiede aufweist: In der ersten (1:) und dritten (3:) Datei sieht die erste Zeile anders aus (1c). Nach der Ausgabe dieser Zeilen folgt die Angabe, was in der zweiten Datei in der ersten Zeile steht.
Die dritte Datei ====3 ist eine Zeile länger als die ersten beiden; diese Zusatzzeile aus der dritten Datei (3:4c Frosch) müsste an die erste und zweite angehängt werden (1:3a, 2:3a), damit die drei Dateien an dieser Stelle übereinstimmen.
Geflickt
Die Unterschiede, die diff herausgefunden hat, lassen sich natürlich im Pager oder Editor betrachten und zum manuellen Abgleichen heranziehen. Bei längeren Textdateien kann das jedoch mühsam sein. Will man die Veränderungen einem anderen Anwender mitteilen, der noch die alte Version der Datei hat, kann man die Unterschiede abspeichern. Das Kommando patch bringt die alte Datei anschließend auf den Stand der neuen.
Ein Patch (“Flicken”) enthält Änderungen im “Unified-Diff-Format”, das diff erzeugt, wenn Sie den Parameter -u verwenden. Die gefundenen Unterschiede tauchen direkt hintereinander auf und sind durch Minus- und Pluszeichen gekennzeichnet:
— datei1.txt Sun Jan 25 16:12:59 2004 +++ datei2.txt Sun Jan 25 16:13:33 2004 @@ -1,5 +1,11 @@ -Auch wenn sich viele Dinge bequem über -grafische Oberflächen wie KDE oder GNOME +Auch wenn sich viele Dinge einfach über +grafische Oberflächen wie GNOME oder KDE …
Wenn Sie die Ausgabe in eine Datei, z. B. patch umleiten, können Sie diese dazu verwenden, die Änderungen in der zweiten Datei auf die erste anzuwenden. Das geht z. B. so:
huhn@asteroid:~$ diff -u datei1.txt datei2.txt > patch huhn@asteroid:~$ patch -b -p0 < patch
Die Optionen bewirken, dass patch ein Backup der Ursprungsdatei anlegt (-b) und dass der Patch im aktuellen Verzeichnis (p0) durchgeführt wird. Ein Blick in die sehr ausführliche Manpage von patch lohnt sich, um noch mehr über das Flicken-Kommando herauszufinden.
Kasten 1: Vimdiff
Mit Vimdiff editieren Sie bis zu vier Dateien gleichzeitig und zeigen deren Unterschiede an. Sie starten den Vimdiff-Modus über vim -d datei1.txt datei2.txt oder vimdiff datei1.txt datei2.txt. Vim zeigt jede Datei in einem separaten Fenster an – standardmäßig verwendet der Editor dazu eine vertikale Aufteilung. Durch Angabe des Parameters -o kann aber auch horizontal gesplittet werden. Weiterführende Informationen zu Vimdiff bietet die hervorragende Programm-eigene Hilfe, die Sie mit :help diff aus Vim heraus starten.
Kasten 2: Ediff im (X)Emacs
Das Tool Ediff ist in den Editor (X)Emacs integriert. Ediff ermöglicht das Vergleichen von zwei oder drei Textdateien. Diese stellt der Editor in separaten Fenstern (über- oder nebeneinander) oder in getrennten Frames dar. Je nach (X)Emacs-Version starten Sie Ediff über das Menü (Tools / Compare / …) oder über die Tastenkombination [Alt-x], ediff (in Emacs-Notation: “M-x ediff”).
Im kleinen externen Ediff-Fenster tippen Sie ?, um eine Übersicht der verfügbaren Kommandos zu erhalten. Außerdem empfiehlt sich ein Blick in die Info-Pages (info ediff) für eine ausführliche Bedienungsanleitung.
Standardmäßig zeigt Ediff keine Farbe an, sondern unterlegt Veränderungen in verschiedenen Grautönen. Wer es lieber bunt wie im Vim mag, tippt [Alt-x] customize ediff-highlighting. Die Einträge Even Diff Face A, Even Diff Face B und Even Diff Face C sind u. a. für das Highlighting zuständig. Per Klick auf den kleinen Pfeil rechts daneben passen Sie Farben und andere Style-Vorgaben an. Vergessen Sie anschließend nicht, die Änderungen mit einem Klick auf Save zu speichern. Über Done verlassen Sie diesen Konfigurationsmodus. Die neuen Farbeinstellungen finden Sie anschließend auch in den Konfigurationsdateien des Editors im eigenen Home-Verzeichnis, im Fall von XEmacs ist das die Datei ~/.xemacs/custom.el.








