Linux / Befehl diff: Textdateien und Verzeichnisse vergleichen

Der diff-Befehl vergleicht zwei Textdateien oder Verzeichnisbäume und meldet, wie sie sich unterscheiden. Die vereinheitlichte Ausgabe von diff -u enthält den umgebenden Kontext und wird häufig für Patches, Code-Reviews und Konfigurationsvergleiche verwendet.

Ergänzende Befehle und Anwendungsfälle finden Sie in Essenzielle Linux-Befehle: Ein praktisches Nachschlagewerk nach Aufgabe.

Was ist der diff-Befehl?

Diff berechnet zeilenorientierte Änderungen, die das erste Eingabeelement in das zweite umwandeln. Keine Ausgabe bedeutet normalerweise, dass keine berichtbaren Unterschiede vorliegen. Der Exit-Status 0 bedeutet gleich, 1 bedeutet, dass Unterschiede gefunden wurden, und 2 bedeutet Probleme, sodass Status 1 ein gültiges Vergleichsergebnis und kein generischer Ausführungsfehler ist.

Grundlegende Syntax

diff [OPTION]... FILE1 FILE2
diff [OPTION]... DIRECTORY1 DIRECTORY2

Optionen und Randfälle können je nach Implementierung und Version variieren. Überprüfen Sie diff --help und man diff auf dem Zielsystem, bevor Sie sich auf implementierungsspezifisches Verhalten verlassen.

Grundlegende Verwendung von diff

Vergleiche zwei Dateien

Das Standardformat beschreibt Zeilenänderungen mithilfe der traditionellen diff-Notation.

diff old.conf new.conf

Vereinheitlichte Ausgabe erzeugen

Das einheitliche Format zeigt geänderte Zeilen mit umgebendem Kontext und ist leichter zu überprüfen.

diff -u old.conf new.conf

Verzeichnisse rekursiv vergleichen

Fügen Sie -r hinzu, um in die entsprechenden Unterverzeichnisse abzusteigen.

diff -ru project-old project-new

Lesen von Änderungsindikatoren und Beendigungsstatus

diff -u zeigt die unterschiedlichen Zeilen zweier Dateien im einheitlichen Format. Im folgenden Beispiel wird old aus der ersten Datei in new in der zweiten Datei geändert.

printf 'old\n' > before.txt
printf 'new\n' > after.txt
diff -u before.txt after.txt

Wichtige Teile der Ausgabe (Dateikopfzeiten werden weggelassen):

-old
+new

- zeigt Zeilen nur in der ersten Datei an, + zeigt Zeilen nur in der zweiten Datei an. Wenn die beiden Dateien unterschiedlich sind, ist der Exit-Status 1, daher muss dies vom Ausführungsfehlstatus 2 unterschieden werden.

Wichtige Optionen

Option Zweck
-u Erzeuge vereinheitlichte Ausgabe mit Kontext.
-r, --recursive Vergleiche Unterverzeichnisse rekursiv.
-q, --brief Melde nur, ob Dateien unterschiedlich sind.
-s Melde auch identische Dateien.
-w Ignoriere alle Unterschiede in den Leerzeichen.
-b Ignoriere Änderungen in der Menge der Leerzeichen.
-i Ignoriere Unterschiede in der Groß- und Kleinschreibung.
--color=auto Farbige Terminalausgabe in unterstützten GNU-Versionen.

Praktische Beispiele

Eine Patch-Datei erstellen

Verwenden Sie stabile relative Pfade, wenn der Patch in einem anderen Arbeitsbaum angewendet werden muss.

diff -u original.conf modified.conf > config.patch

Unterschiede im Verzeichnis zusammenfassen

Die -qr-Kombination meldet unterschiedliche und einseitige Dateien, ohne jede geänderte Zeile auszugeben.

diff -qr release-a release-b

Ignoriere nur Änderungen der Leerraum-Breite

Dies nur verwenden, wenn Leerzeichen semantisch nicht wichtig sind; bei einrückungssensitiven Sprachen ist besondere Vorsicht erforderlich.

diff -u -b before.txt after.txt

diff und verwandte Befehle

Befehl Hauptrolle Geeignet für
diff Zeilenorientierte Textunterschiede Quell-, Konfigurations- und Verzeichnisbäume
cmp Byte-orientierter erster Unterschied Gleichheits- und Offset-Prüfungen
git diff Repository-bewusste Unterschiede Git-Arbeitsbäume und Commits
comm Mengenartiger Vergleich von sortierten Zeilen Einzigartige und gemeinsame Datensätze

Wichtige Hinweise

Exit-Status 1 bedeutet verschieden

Behandeln Sie ihn als normales Vergleichsergebnis; Status 2 zeigt ein echtes Problem an.

Detaillierte binäre Differenzen eignen sich nicht für die Anzeige in Zeilen

Verwenden Sie cmp oder ein Prüfsummen-Tool, wenn die Gleichheit der Bytes die Hauptfrage ist.

Leerzeichen-Optionen können bedeutende Änderungen verbergen

Ignorieren Sie Einrückungen oder Abstände nicht, wenn das Dateiformat ihnen semantische Bedeutung verleiht.

FAQ

Was bedeutet leere diff-Ausgabe?

Die Eingaben zeigen keine meldbaren Unterschiede unter den gewählten Optionen.

Welches Ausgabeformat ist am einfachsten zu lesen?

Die einheitliche Ausgabe von diff -u ist normalerweise am bequemsten.

Kann diff ganze Verzeichnisse vergleichen?

Ja. Verwenden Sie -r für einen rekursiven Vergleich.

Ist der Exit-Code 1 ein Fehler?

Nein. Er bedeutet normalerweise, dass Unterschiede gefunden wurden; Code 2 weist auf ein Problem hin.

Weitere Angaben zu Syntax, Implementierung und Verfügbarkeit finden Sie unter GNU Diffutils diff Dokumentation.