Der Befehl diff vergleicht zwei Dateien Zeile für Zeile und zeigt die Unterschiede zwischen ihnen an. Das Ergebnis beschreibt, welche Änderungen nötig wären, um die erste Datei in die zweite zu überführen.
diff ist ein grundlegendes Werkzeug für die Arbeit mit Textdateien. Entwickler nutzen es, um Code-Änderungen nachzuvollziehen, Systemadministratoren vergleichen damit Konfigurationsdateien, und Patches für Softwareprojekte basieren auf dem Ausgabeformat von diff.
Syntax des diff-Befehls
diff [OPTIONEN] DATEI1 DATEI2
OPTIONEN- Flags, die das Ausgabeformat und Vergleichsverhalten steuern.DATEI1- Die ursprüngliche Datei (Ausgangszustand).DATEI2- Die geänderte Datei (Zielzustand).
Wenn beide Dateien identisch sind, gibt diff nichts aus und beendet sich mit dem Exitcode 0. Bei Unterschieden ist der Exitcode 1.
Beispieldateien für die Demonstration
Die folgenden Beispiele verwenden zwei Dateien mit Distributionen:
distributionen-alt.txt:
Ubuntu
Arch Linux
Debian
CentOS
Fedora
distributionen-neu.txt:
Kubuntu
Ubuntu
Debian
Arch Linux
Centos
Fedora
Das normale Ausgabeformat
Ohne Optionen zeigt diff die Unterschiede im normalen Format:
diff distributionen-alt.txt distributionen-neu.txt
Die Ausgabe sieht so aus:
0a1
> Kubuntu
2d2
< Arch Linux
4c4,5
< CentOS
---
> Arch Linux
> Centos
Jeder Block beschreibt eine Änderung. Die Notation 0a1, 2d2 und 4c4,5 sind Änderungsbefehle mit folgender Struktur:
- Die Zahl vor dem Buchstaben bezieht sich auf die erste Datei.
- Der Buchstabe gibt die Art der Änderung an.
- Die Zahl nach dem Buchstaben bezieht sich auf die zweite Datei.
Die drei Änderungstypen:
| Zeichen | Bedeutung | Englisch |
|---|---|---|
a | Hinzufügen | add |
c | Ändern | change |
d | Löschen | delete |
In der Ausgabe markiert < Zeilen aus der ersten Datei und > Zeilen aus der zweiten Datei.
Die Beispielausgabe bedeutet:
0a1- Nach Zeile 0 der ersten Datei (also am Anfang) die Zeile “Kubuntu” einfügen.2d2- Zeile 2 der ersten Datei (“Arch Linux”) löschen.4c4,5- Zeile 4 der ersten Datei (“CentOS”) durch die Zeilen 4-5 der zweiten Datei ersetzen.
Das Kontextformat mit -c
Die Option -c zeigt zusätzlich Kontextzeilen um die Änderungen herum. Das macht es einfacher, die Position der Unterschiede zu erkennen:
diff -c distributionen-alt.txt distributionen-neu.txt
*** distributionen-alt.txt 2025-01-15 14:30:00.000000000 +0100
--- distributionen-neu.txt 2025-01-15 14:35:00.000000000 +0100
***************
*** 1,5 ****
Ubuntu
- Arch Linux
Debian
! CentOS
Fedora
--- 1,6 ----
+ Kubuntu
Ubuntu
Debian
! Arch Linux
! Centos
Fedora
Die Symbole im Kontextformat:
| Symbol | Bedeutung |
|---|---|
| (Leerzeichen) | Zeile ist in beiden Dateien identisch (Kontextzeile) |
- | Zeile existiert nur in der ersten Datei |
+ | Zeile existiert nur in der zweiten Datei |
! | Zeile wurde zwischen den Dateien geändert |
Mit der Option -C (großes C) kannst du die Anzahl der Kontextzeilen festlegen:
diff -C 1 distributionen-alt.txt distributionen-neu.txt
Das Unified-Format mit -u
Das Unified-Format kombiniert beide Dateien in einer kompakteren Darstellung. Es ist das Standardformat für Patches und Git-Diffs:
diff -u distributionen-alt.txt distributionen-neu.txt
--- distributionen-alt.txt 2025-01-15 14:30:00.000000000 +0100
+++ distributionen-neu.txt 2025-01-15 14:35:00.000000000 +0100
@@ -1,5 +1,6 @@
+Kubuntu
Ubuntu
-Arch Linux
Debian
-CentOS
+Arch Linux
+Centos
Fedora
Der Header @@ -1,5 +1,6 @@ zeigt die Zeilenbereiche:
-1,5- Zeilen 1-5 aus der ersten Datei (mit-markiert im Header).+1,6- Zeilen 1-6 aus der zweiten Datei (mit+markiert im Header).
Im Unified-Format bedeuten die Symbole:
| Symbol | Bedeutung |
|---|---|
| (Leerzeichen) | Zeile ist in beiden Dateien identisch |
- | Zeile wird entfernt |
+ | Zeile wird hinzugefügt |
Mit -U legst du die Anzahl der Kontextzeilen fest:
diff -U 5 config-alt.conf config-neu.conf
Groß- und Kleinschreibung ignorieren
Standardmäßig unterscheidet diff zwischen Groß- und Kleinschreibung. In den Beispieldateien wird “CentOS” und “Centos” als unterschiedlich erkannt.
Mit der Option -i ignorierst du diese Unterschiede:
diff -ui distributionen-alt.txt distributionen-neu.txt
Jetzt werden “CentOS” und “Centos” als identisch behandelt.
Leerzeichen ignorieren
Für Vergleiche, bei denen Leerzeichen keine Rolle spielen sollen:
diff -b datei1.txt datei2.txt # Unterschiede bei Leerzeichen-Anzahl ignorieren
diff -w datei1.txt datei2.txt # Alle Leerzeichen ignorieren
diff -B datei1.txt datei2.txt # Leerzeilen ignorieren
Diese Optionen sind nützlich beim Vergleichen von Code mit unterschiedlicher Einrückung.
Verzeichnisse vergleichen
Mit diff kannst du auch zwei Verzeichnisse vergleichen:
diff verzeichnis1/ verzeichnis2/
Das zeigt, welche Dateien nur in einem der Verzeichnisse existieren und welche sich inhaltlich unterscheiden.
Für einen rekursiven Vergleich aller Unterverzeichnisse:
diff -r projekt-v1/ projekt-v2/
Ausgabe in eine Patch-Datei schreiben
Die Ausgabe von diff lässt sich in eine Patch-Datei umleiten, die später mit dem patch-Befehl angewendet werden kann:
diff -u original.conf geaendert.conf > aenderungen.patch
Zum Anwenden des Patches:
patch original.conf < aenderungen.patch
Nur prüfen, ob Dateien unterschiedlich sind
Wenn du nur wissen willst, ob sich Dateien unterscheiden, ohne die Details zu sehen:
diff -q datei1.txt datei2.txt
Bei Unterschieden gibt diff eine kurze Meldung aus. Bei identischen Dateien erscheint keine Ausgabe.
Side-by-Side-Vergleich
Für eine nebeneinander gestellte Ansicht:
diff -y distributionen-alt.txt distributionen-neu.txt
Mit --width legst du die Breite der Ausgabe fest:
diff -y --width=80 datei1.txt datei2.txt
Zusammenfassung
Der diff-Befehl vergleicht Textdateien und zeigt ihre Unterschiede an. Die wichtigsten Optionen:
| Option | Wirkung |
|---|---|
-u | Unified-Format (kompakt, für Patches) |
-c | Kontextformat (mit umgebenden Zeilen) |
-i | Groß-/Kleinschreibung ignorieren |
-w | Alle Leerzeichen ignorieren |
-r | Verzeichnisse rekursiv vergleichen |
-q | Nur melden, ob Unterschiede existieren |
-y | Side-by-Side-Ansicht |
Für tiefergehende Vergleiche mit Syntax-Highlighting und interaktiver Navigation bieten sich grafische Tools wie meld, vimdiff oder kdiff3 an.