Der unbekannte Befehl – „diff“ der Differenzierer

diff ist ein Linux-Kommando zum inhaltlichen Vergleich von Dateien oder Ordnern. Dabei können die Unterschiede so dargestellt werden, dass durch die Ausgabe von diff eine Datei in die andere überführt werden kann. Dies hat eine Bedeutung beim schreiben von Patch-Dateien, durch die Änderungen an Programmcodes vorgenommen werden und diese Änderung daher nur in einer ASCII-Datei vorliegen braucht.

Wenn man zwei identische Dateien miteinander vergleicht so gibt diff keine Meldung aus. Mit der Option -s sieht das Ergebnis dann so aus:

$ diff -s orginal.txt modify.txt
Dateien orginal.txt und modify.txt sind identisch.

und es wird nur angezeigt ob die beiden inhaltlich völlig Dateien identisch sind. Interessant wird diese Funktion jedoch bei inhaltlich unterschiedlichen Dateien die in einem Zusammenhang stehen wie z.B. eine Originalquelle und der geänderte, gepatchte Quelltext.

Im weiteren Beispiel werden die beiden unterschiedliche Dateien benutzt:

original.txtmodify.txt
1 Lorem
2 ipsum
3 dolor
4 sit
5 amet
6 consetetur
7 sadipscing
8 elitr
9 sed
10 diam
1 Lorem
2 ipsum
3 dolor
4
5 geändert
6 auch geändert

8 elitr
9 sed
10 diam

Wenn sich die beiden Dateien unterscheiden sieht die Ausgabe aus wie ohne Option:

diff -s original.txt modify.txt
4,7c4,7
< 4 sit
< 5 amet
< 6 consetetur
< 7 sadipscing
---
> 4
> 5 geändert
> 6 auch geändert
>

Die erste Zeile (4,7c4,7) an welchen Zeilen der Textdatei orginal.txt Änderungen stattfinden müssen um diese in die Textdatei modify.txt zu überführen. Die Kürzel bedeuten, dass an Zeile 4–7 in original.txt Änderungen stattfinden müssen damit Zeilen 4–7 in Datei modify.txt erhalten werden. Die Änderung wird hier mit c abgekürzt und heißt change – daneben gibt es noch d für delete und a für add. Zeilen mit < sind in der Datei original.txt und Zeilen mit > in der Datei modify.txt vorhanden.

Man kann auch die Option -y benutzen um die kryptische Ausgabe von diff eher als vergleichend darstellt:

$ diff -y original.txt modify.txt
1 Lorem                                    1 Lorem
2 ipsum                                    2 ipsum
3 dolor                                    3 dolor
4 sit                                    | 4
5 amet                                   | 5 geändert
6 consetetur                             | 6 auch geändert
7 sadipscing                             |
8 elitr                                    8 elitr
9 sed                                      9 sed
10 diam                                    10 diam

Man kann auch Ordner miteinander vergleichen ob die Inhalte identisch sind. Grundsätzlich sieht die Ausgabe bei Identität gleich aus wie bei Dateien. Fehlt eine Datei in einem Ordner so erhält man folgende Ausgabe:

$ diff example1/ example2/
Nur in example1/: orginal1.txt.

Wie bereits in der Einleitung beschrieben ist diff ein wichtiges Werkzeug zur Erstellung einer Patch-Datei die man mit dem Befehl patch benutzen kann. Die einfachste Form eine Patchdatei zu erstellen wäre der Syntax:

diff -u OriginalFile UpdatedFile > PatchFile

wobei die Option -u für unified Format steht. Da sich Quelltexte oft über Unterverzeichnisse und mehrere Dateien erstrecken so wird jedoch häufig die Form:

diff -ruN OriginalDir UpdatedDir > PatchFile

Die neuen Optionen -r steht hier für rekursiv und -N für das Erstellen von fehlenden Dateien.

Für das obige Beispiel mit original.txt und modifiy.txt würde das Patchfile mit -u folgendermaßen aussehen:

$ cat patchfile.txt
--- orginal.txt 2020-07-29 23:59:11.260367960 +0200
+++ modify.txt 2020-07-29 23:59:11.260367960 +0200
@@ -1,10 +1,10 @@
1 Lorem
2 ipsum
3 dolor
-4 sit
-5 amet
-6 consetetur
-7 sadipscing
+4
+5 geändert
+6 auch geändert
+
8 elitr
9 sed
10 diam

1 Gedanke zu „Der unbekannte Befehl – „diff“ der Differenzierer“

Kommentare sind geschlossen.

kais-universum.de