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:

ZeichenBedeutungEnglisch
aHinzufügenadd
cÄndernchange
dLöschendelete

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:

SymbolBedeutung
(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:

SymbolBedeutung
(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:

OptionWirkung
-uUnified-Format (kompakt, für Patches)
-cKontextformat (mit umgebenden Zeilen)
-iGroß-/Kleinschreibung ignorieren
-wAlle Leerzeichen ignorieren
-rVerzeichnisse rekursiv vergleichen
-qNur melden, ob Unterschiede existieren
-ySide-by-Side-Ansicht

Für tiefergehende Vergleiche mit Syntax-Highlighting und interaktiver Navigation bieten sich grafische Tools wie meld, vimdiff oder kdiff3 an.

Verwandte Artikel