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.




