diff
Der Shell-Befehl diff ist ein Textvergleichswerkzeug und vergleicht zeilenweise zwei Textdateien oder den Inhalt von zwei Verzeichnissen, zeigt auf der Konsole die Unterschiede und schreibt die Änderungsvorschläge auf Wunsch in eine Patchdatei, mit der die gewünschte Datei vollautomatisch angepasst werden kann. Zur Arbeit mit drei Dateien wird diff3 verwendet.
Das in Python und GTK entwickelte Programm Meld bietet unter einer grafischen Oberfläche kombiniert die Funktionen von diff und merge, es können damit also die optisch hervorgehobenen Unterschiede in Textdateien sofort erkannt und mit der Maus hin- und hergeschoben werden.
Grafische Oberflächen für diff bieten die Programme Beediff, Diffuse, Kdiff3, Meld, TkDiff und Xxdiff.
Arbeitsweise
Die Ausgabe von diff besteht aus Kontextzeilen aus beiden Dateien, wobei der Text aus der ersten Datei durch das Symbol "<" markiert ist, der Text aus der zweiten Datei durch das Symbol ">".
Neben den Zeilen, die sich voneinander unterscheiden, wird auch eine Angabe gemacht, die verrät, was geändert werden muss, damit die Dateien sich nicht mehr unterscheiden. Diese Änderungsvorschläge folgen immer demselben Schema: neben der Zeilennummer oder einem Bereich (Zeilennummer durch Kommata getrennt) steht hier einer der drei Buchstaben "a", "c" oder "d":
- a steht für "append" (anhängen)
- c steht für "change" (verändern)
- d steht für "delete" (löschen)
Folgende Zeile bedeutet, dass die Zeilen 9 bis 12 der ersten Datei oder die Zeilen 9 bis 13 der zweiten Datei verändert werden müssen, damit sich die beiden Dateien nicht mehr voneinander unterscheiden.
9,12c9,13
Folgende Zeile bedeutet, dass die Zeilen 13 und 15 der zweiten Datei hinter Zeile 3 der ersten eingefügt werden muss, damit sich die beiden Dateien nicht mehr voneinander unterscheiden.
3a,13,15
Folgende Zeile bedeutet, dass die Zeilen 4 bis 7 der ersten Datei gelöscht oder entsprechend nach Zeile 8 der zweiten Datei angehängt werden müssen, damit sich die beiden Dateien nicht mehr voneinander unterscheiden.
4-7,d8
Optionen
Option | Beschreibung |
---|---|
-B | Leerzeilen werden nicht beachtet. |
-E | Tabulatoren werden nicht beachtet. |
-b | Einfache Leerzeichen nicht beachtet. |
-w | Sämtliche Leerzeichen werden nicht beachtet. |
-i | Gross- und Kleinschreibung wird nicht beachtet. |
Verwendung
Vergleichen von Dateien
$ more file1 ABC CDE EFG FGH $ more file2 ABC EFG OPQ XYZ
Vergleich der Dateien "file1" und "file2". Das Kleiner-Zeichen ("<") zeigt die nur in der Datei "file1" vorkommenden Zeilen, das Grösser-Zeichen (">") zeigt die nur in der Datei "file2" vorkommenden Zeilen. Ausserdem wird hinter den Zeilen aus der Datei "file1" eine Zeile mit drei Minuszeichen ("---") eingefügt, falls im selben Block Informationen aus der Datei "file2" folgen.
$ diff file1 file2 2d1 < CDE 4c3,4 < FGH --- > OPQ > XYZ
Ausgabe mit mehr Format und standardmässig drei Zeilen Kontext. Als erstes werden die Namen der beiden Dateien sowie das Datum der letzten Änderung angezeigt. Die erste Datei wird mit Sternchen ("*"), die zweite mit Bindestrichen ("-") gekennzeichnet. Zeilen, die einen UNterschied aufweisen, haben ein Ausrufezeichen ("!") vornagestellt; Dinge die übereinstimmen tragen keine Markierung; neue Abschnitte tragen ein Pluszeichen; nicht mehr vorhandene Zeilen sind mit einem Minuszeichen gekennzeichnet.
diff -c file1 file2 *** file1 2007-04-02 17:03:16.000000000 +0200 --- file2 2007-04-02 17:00:16.000000000 +0200 *************** *** 1,4 **** ABC - CDE EFG ! FGH --- 1,4 ---- ABC EFG ! OPQ ! XYZ
Anzeige der Unterschiede zwischen Datei "file1" und Datei "file2" nebeneinander und Markierung der Zeilen, in denen die Datei "file2" von Datei "file1" abweicht. Die Zeilenbreite beträgt standardmässig 130 Zeichen.
$ diff -y file1 file2 ABC ABC CDE < EFG EFG FGH | OPQ > XYZ
Anzeige der Unterschiede zwischen der Datei "file1" und der Datei "file2" nebeneinander und Markierung der Zeilen, in denen die Datei "file2" von Datei "file1" abweicht. Die Zeilenbreite beträgt 90 Zeichen.
$ diff -y -W 90 file1 file2 ABC ABC CDE < EFG EFG FGH | OPQ > XYZ
Anzeige der Unterschiede zwischen der Datei "file1" und der Datei "file2" nebeneinander und Markierung der Zeilen, in denen die Datei "file2" von Datei "file1" abweicht. Gemeinsame Zeilen werden nicht angezeigt. Die Zeilenbreite beträgt 90 Zeichen.
$ diff -y --suppress-common-lines -W 90 file1 file2 CDE < FGH | OPQ > XYZ
Generierung von ed-Output:
$ diff -e foo bar 1c bar .
Darstellung der Unterschiede zwischen den Dateien "file1" und "file2" nebeneinander. Dabei werden höchstens 80 Druckspalten pro Zeile ausgegeben.
$ sdiff -w 80 file1 file2
Vergleichen von Verzeichnissen
Wird diff mit zwei Verzeichnisnamen aufgerufen, so wird jede DAtei verglichen, die in beiden Verzeichnissen auftaucht. Alternativ kann diff ein Datei- und Verzeichnisname übergeben werden. Im angegebenen Verzeichnis wird dann nach der Datei gesucht und der Vergleich im Erfolgsfall gestartet. Wenn zwei Dateien übereinstimmen, schweigt sich diff aus.
Verwendung von Patches
Erstellung einer Ausgabe im "Unified Format" - diese Ausgabe wird auch als "Patch" (dt. Flicken) bezeichnet. In der Ausgabedatei "patchfile" erscheinen beide Dateinamen untereinander und zeigen das Datum der letzten Änderung sowie drei Zeilen Kontext.
$ diff -u file1 file2 > patchfile $ more patchfile --- file1 2007-04-02 17:03:16.000000000 +0200 +++ file2 2007-04-02 17:00:16.000000000 +0200 @@ -1,4 +1,4 @@ ABC -CDE EFG -FGH +OPQ +XYZ
Anbringen des Patch, wobei vor dem Einspielen der Änderung eine Sicherung der Originaldatei ("-b") angelegt wird. Das heisst, von der Datei "file1" wird die Sicherungsdatei "file1.orig" angelegt, danach die Datei "file1" so gepatcht, dass ihr Inhalt derjenigen von Datei "file2" entspricht.
$ patch -b < patchfile patching file file1
Die Datei "file2" wird mit Hilfe der Datei "patchfile" so verändert, dass ihr Inhalt dem der Datei "file1" entspricht. Pfadbezeichnungen werden dabei nicht verändert.
$ patch -p0 file2 > patchfile
Weblinks
- Diff and other tools for detecting changes in sources (Softpanorama.org)