Diffutils

Aus LinuxUser 11/2006

Diffutils

Der kleine Unterschied

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.

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).

Abbildung 2: Mit Syntax-Highlighting ist die Diff-Ausgabe gleich viel übersichtlicher.

Abbildung 2: Mit Syntax-Highlighting ist die Diff-Ausgabe gleich viel übersichtlicher.

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.

LinuxUser 11/2006 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben