diff-Befehl: Dateien vergleichen, das Patch-Format von diff -u und Optionen
Der diff-Befehl ist ein Linux-Befehl, der zwei Dateien zeilenweise vergleicht und nur die unterschiedlichen Zeilen ausgibt. Beim Vergleich einer alten und einer neuen Datei, die eine Webserver-Konfiguration nachbilden, zeigte diff die drei geänderten Stellen in den drei Zeilen 2,3c2,3, 5d4 und 6a6, und in der mit der Option -u gespeicherten Patch-Datei standen dieselben Änderungen mit Minus- und Pluszeichen.
Die Dateinamen und Inhalte in der Ausgabe unten sowie der Arbeitsordner /root/work sind Beispielwerte. Alle verglichenen Dateien sind kleine, zum Testen angelegte Dateien.
1️⃣ Grundlegende Verwendung des diff-Befehls und die Ausgabe lesen
Die Grundform des Befehls ist diff, Optionen, erste Datei, zweite Datei, in dieser Reihenfolge. Ausgegeben wird mit Zeilennummern, welche Zeilen geändert, gelöscht oder hinzugefügt werden müssen, damit die erste Datei der zweiten gleicht.
Die beiden für den Vergleich verwendeten Dateien sind sechszeilige Dateien, die eine Webserver-Konfiguration nachbilden.
cd /root/workcat config-old.conf# app config
listen 80
server_name example.com
root /var/www/html
gzip off
log_level warncat config-new.conf# app config
listen 443
server_name example.com www.example.com
root /var/www/html
log_level warn
cache onDie beiden Dateien wurden ohne Optionen verglichen.
diff config-old.conf config-new.conf2,3c2,3
< listen 80
< server_name example.com
---
> listen 443
> server_name example.com www.example.com
5d4
< gzip off
6a6
> cache onecho $?1In der Ausgabe wechseln sich Positionszeilen und Inhaltszeilen ab. Der mittlere Buchstabe einer Positionszeile steht bei c für Ändern, bei d für Löschen und bei a für Hinzufügen; links vom Buchstaben stehen die Zeilennummern der ersten Datei, rechts die der zweiten. Gibt es Unterschiede, ist der Exit-Code 1.
| Ausgabe | Bedeutung |
|---|---|
| 2,3c2,3 | Ändert die Zeilen 2–3 der ersten Datei in die Zeilen 2–3 der zweiten Datei (change) |
| 5d4 | Löscht Zeile 5 der ersten Datei (delete). Danach passt die Stelle hinter Zeile 4 der zweiten Datei |
| 6a6 | Fügt Zeile 6 der zweiten Datei hinter Zeile 6 der ersten Datei ein (add) |
| < Zeile | Zeile aus der ersten Datei |
| > Zeile | Zeile aus der zweiten Datei |
| --- | Grenze zwischen der Seite der ersten Datei und der Seite der zweiten Datei bei geänderten Zeilen (c) |
Beim Vergleich von Dateien mit gleichem Inhalt wird nichts ausgegeben, und der Befehl endet mit dem Exit-Code 0.
diff config-old.conf config-copy.confecho $?0Wird eine Datei angegeben, die es nicht gibt, erscheint eine Fehlermeldung, und der Exit-Code ist 2.
diff config-old.conf nosuch.confdiff: nosuch.conf: No such file or directoryecho $?2In einem Skript lassen sich mit diesen drei Werten gleich, unterschiedlich und Fehler unterscheiden.
2️⃣ Das Unified-Format von diff -u und Patch-Dateien
Die normale Ausgabe zeigt nur die geänderten Zeilen, sodass in einer Konfigurationsdatei mit Hunderten von Zeilen schwer zu erkennen ist, in der Nähe welcher Einstellung sie liegen. Mit -u erfolgt die Ausgabe im Unified-Format (unified), das bis zu drei Zeilen vor und nach den geänderten Zeilen mit zusammenfasst.
diff -u config-old.conf config-new.conf--- config-old.conf 2026-10-29 02:24:50.840228932 +0000
+++ config-new.conf 2026-10-29 02:24:50.840228932 +0000
@@ -1,6 +1,6 @@
# app config
-listen 80
-server_name example.com
+listen 443
+server_name example.com www.example.com
root /var/www/html
-gzip off
log_level warn
+cache onDie beiden Kopfzeilen (---, +++) zeigen Namen und Änderungszeit der beiden Dateien, und die Zeile @@ -1,6 +1,6 @@ steht für einen Block (hunk), der 6 Zeilen ab Zeile 1 der ersten Datei und 6 Zeilen ab Zeile 1 der zweiten Datei zusammenfasst. In den Zeilen darunter bedeutet ein - am Anfang eine aus der ersten Datei gelöschte Zeile, ein + eine zur zweiten Datei hinzugefügte Zeile und ein Leerzeichen eine Zeile, die in beiden Dateien gleich ist.
-c ist das Kontextformat (context). Der Block der ersten Datei und der Block der zweiten Datei werden getrennt ausgegeben, mit einem Ausrufezeichen vor geänderten Zeilen, einem Minuszeichen bei gelöschten und einem Pluszeichen bei hinzugefügten Zeilen.
diff -c config-old.conf config-new.conf*** config-old.conf Thu Oct 29 02:24:50 2026
--- config-new.conf Thu Oct 29 02:24:50 2026
***************
*** 1,6 ****
# app config
! listen 80
! server_name example.com
root /var/www/html
- gzip off
log_level warn
--- 1,6 ----
# app config
! listen 443
! server_name example.com www.example.com
root /var/www/html
log_level warn
+ cache onBei denselben Änderungen wurde -c länger als -u, weil die unveränderten Zeilen in beiden Blöcken je einmal erscheinen.
Wird die Ausgabe von -u in einer Datei gespeichert, ist diese Datei bereits die Patch-Datei. Auch wenn die Ausgabe in eine Datei geleitet wird, bleibt der Exit-Code von diff 1.
diff -u config-old.conf config-new.conf > /root/work/config.patchecho $?1cat /root/work/config.patch--- config-old.conf 2026-10-29 02:24:50.840228932 +0000
+++ config-new.conf 2026-10-29 02:24:50.840228932 +0000
@@ -1,6 +1,6 @@
# app config
-listen 80
-server_name example.com
+listen 443
+server_name example.com www.example.com
root /var/www/html
-gzip off
log_level warn
+cache onDer Inhalt der gespeicherten Datei entspricht dem auf dem Bildschirm ausgegebenen Ergebnis von -u. Wird diese Datei an den Befehl patch übergeben, lässt sich die erste Datei auf den Inhalt der zweiten bringen.
3️⃣ diff-Optionen und das Ignorieren von Leerzeichen und Groß-/Kleinschreibung
Beim Abschreiben einer Konfiguration von Hand entstehen Zeilen, die inhaltlich gleich sind und sich nur in Groß-/Kleinschreibung oder Leerzeichen unterscheiden. Im zweiten Paar von Beispieldateien wurde das große L der ersten Zeile klein geschrieben, aus einem Leerzeichen in der zweiten Zeile wurden zwei, und eine Leerzeile kam hinzu.
cat case-a.txtListen 80
ServerName example.com
DocumentRoot /var/www/htmlcat case-b.txtlisten 80
ServerName example.com
DocumentRoot /var/www/htmldiff case-a.txt case-b.txt1,2c1,3
< Listen 80
< ServerName example.com
---
> listen 80
> ServerName example.com
>Ohne Optionen erscheinen auch die gleichbedeutenden Zeilen 1–2 als geänderte Zeilen. Wird mit -i die Groß-/Kleinschreibung ignoriert, fällt die Listen-Zeile weg, und nur Zeile 2 der ersten Datei bleibt übrig.
diff -i case-a.txt case-b.txt2c2,3
< ServerName example.com
---
> ServerName example.com
>Mit zusätzlichem -w werden alle Leerzeichen innerhalb einer Zeile ignoriert, sodass auch die ServerName-Zeile als gleich gilt und nur die in Zeile 3 hinzugefügte Leerzeile übrig bleibt. Mit -b, das nur die Anzahl der Leerzeichen ignoriert, statt -w ergab sich bei diesen Dateien dasselbe Ergebnis.
diff -i -w case-a.txt case-b.txt2a3
>Kommt noch -B hinzu, werden auch Unterschiede bei Leerzeilen ignoriert, sodass der Befehl ohne Ausgabe mit dem Exit-Code 0 endete.
diff -i -w -B case-a.txt case-b.txtecho $?0Um die beiden Dateien links und rechts nebeneinander zu sehen, wird -y verwendet. Die Standardbreite beträgt 130 Spalten und wurde deshalb mit -W 70 verkleinert.
diff -y -W 70 config-old.conf config-new.conf# app config # app config
listen 80 | listen 443
server_name example.com | server_name example.com www.ex
root /var/www/html root /var/www/html
gzip off <
log_level warn log_level warn
> cache onDer senkrechte Strich (|) in der Mitte kennzeichnet eine geänderte Zeile, < eine Zeile nur in der ersten Datei und > eine Zeile nur in der zweiten Datei. Bei geringerer Breite werden lange Zeilen abgeschnitten. Die server_name-Zeile erschien rechts nur bis www.ex.
Mit zusätzlichem --suppress-common-lines werden gleiche Zeilen weggelassen, und nur die unterschiedlichen bleiben.
diff -y --suppress-common-lines -W 70 config-old.conf config-new.conflisten 80 | listen 443
server_name example.com | server_name example.com www.ex
gzip off <
> cache onSoll nur geprüft werden, ob die Dateien gleich oder verschieden sind, und nicht, worin der Unterschied besteht, wird -q verwendet. Sind die Dateien gleich, gibt -q nichts aus; für eine Zeile mit der Meldung, dass sie gleich sind, wird -s verwendet.
diff -q config-old.conf config-new.confFiles config-old.conf and config-new.conf differdiff -s config-old.conf config-copy.confFiles config-old.conf and config-copy.conf are identicalDie Optionen sind in den zwei Tabs unten zusammengefasst.
| Option | Kopieren | Beschreibung |
|---|---|---|
| -u, --unified | Ausgabe im Unified-Format, das bis zu drei Zeilen vor und nach den geänderten Zeilen mit zusammenfasst | |
| -c, --context | Kontextformat, das den Block der ersten Datei und den Block der zweiten Datei getrennt ausgibt | |
| -i, --ignore-case | Ignoriert Unterschiede in der Groß-/Kleinschreibung | |
| -w, --ignore-all-space | Ignoriert alle Leerzeichen innerhalb einer Zeile | |
| -b, --ignore-space-change | Ignoriert nur Unterschiede in der Anzahl der Leerzeichen | |
| -B, --ignore-blank-lines | Ignoriert Unterschiede bei Leerzeilen | |
| -y, --side-by-side | Gibt die beiden Dateien links und rechts nebeneinander aus | |
| -W, --widthNUM | Legt die Breite der Ausgabe nebeneinander fest. Standardwert sind 130 Spalten | |
| --suppress-common-lines | Lässt bei der Ausgabe nebeneinander gleiche Zeilen weg und gibt nur unterschiedliche aus | |
| -q, --brief | Gibt nur aus, ob die Dateien gleich oder verschieden sind. Bei gleichen Dateien erfolgt keine Ausgabe | |
| -s, --report-identical-files | Gibt bei zwei gleichen Dateien eine Zeile mit der Meldung aus, dass sie gleich sind | |
| -r, --recursive | Vergleicht auch die Dateien in Unterordnern |
| Option | Kopieren | Beschreibung |
|---|---|---|
| -U, --unifiedNUM | Legt fest, wie viele Zeilen davor und danach im Unified-Format mit ausgegeben werden. Standardwert ist 3 | |
| -N, --new-file | Behandelt eine auf einer Seite fehlende Datei als leere Datei | |
| -x, --excludePAT | Schließt Dateien, deren Name zum Muster passt, vom Vergleich aus | |
| -I, --ignore-matching-linesRE | Ignoriert einen Unterschied, wenn alle geänderten Zeilen zum Regex passen | |
| -Z, --ignore-trailing-space | Ignoriert Leerzeichen am Zeilenende | |
| -E, --ignore-tab-expansion | Ignoriert Unterschiede, die durch das Umwandeln von Tabs in Leerzeichen entstehen | |
| -a, --text | Behandelt alle Dateien als Text | |
| --strip-trailing-cr | Entfernt vor dem Vergleich den Wagenrücklauf am Zeilenende | |
| --colorWHEN | Färbt die Ausgabe ein. WHEN ist never, always oder auto | |
| -v, --version | Gibt Versionsinformationen aus |
🔲 Simulator für den diff-Befehl
Im Simulator unten lässt sich diff mit den Beispieldateien aus dem Artikel direkt eingeben. Mit -u lässt sich eine Patch-Datei speichern, mit -i -w -B und -rq lässt sich vergleichen, und nach dem Hinzufügen einer Zeile zu config-new.conf zeigt ein erneuter Vergleich das geänderte Ergebnis.
4️⃣ Ordner vergleichen mit diff -r
Um mehrere Dateien auf einmal zu vergleichen, etwa vor und nach dem Deployment von Website-Dateien, werden statt Dateien Ordnernamen angegeben. Die Beispielordner site-v1 und site-v2 enthalten beide index.html und einen Ordner css, während about.html und contact.html nur auf einer Seite vorhanden sind.
diff site-v1 site-v2Only in site-v1: about.html
Only in site-v2: contact.html
Common subdirectories: site-v1/css and site-v2/css
diff site-v1/index.html site-v2/index.html
2,3c2,3
< <p>Version 1</p>
< <a href="about.html">About</a>
---
> <p>Version 2</p>
> <a href="contact.html">Contact</a>Beim Vergleich von Ordnern ohne Optionen erscheinen Dateien, die nur auf einer Seite vorhanden sind, als Zeilen mit [Only in] und Unterordner nur als Zeilen mit [Common subdirectories]; die Dateien in den Unterordnern werden nicht verglichen. Für index.html, das in beiden Ordnern unter demselben Namen liegt, werden die Unterschiede unter der Zeile [diff site-v1/index.html site-v2/index.html] ausgegeben. Mit -r wird auch der geänderte Farbwert in style.css im Ordner css ausgegeben.
diff -r site-v1 site-v2Only in site-v1: about.html
Only in site-v2: contact.html
diff -r site-v1/css/style.css site-v2/css/style.css
2c2
< h1 { color: #222; }
---
> h1 { color: #0a58ca; }
diff -r site-v1/index.html site-v2/index.html
2,3c2,3
< <p>Version 1</p>
< <a href="about.html">About</a>
---
> <p>Version 2</p>
> <a href="contact.html">Contact</a>Bei einem Ordner mit vielen Dateien wird zuerst mit -rq die Liste der geänderten Dateien geprüft, und danach werden nur die benötigten Dateien erneut mit diff verglichen.
diff -rq site-v1 site-v2Only in site-v1: about.html
Only in site-v2: contact.html
Files site-v1/css/style.css and site-v2/css/style.css differ
Files site-v1/index.html and site-v2/index.html differ🔢 FAQ & empfohlene Inhalte
Linux · Text
Linux-grep-Befehl
So lassen sich mit grep in einer Textdatei wie einer Logdatei nur die Zeilen finden und ausgeben, die die gesuchte Zeichenkette enthalten.
Linux · Text
Linux-sort-Befehl: Dateien sortieren
Optionen und Beispiele für sort, um Dateiinhalte alphabetisch oder auf- und absteigend zu sortieren.
Linux · Text
Linux-uniq-Befehl
So verwendest du uniq, um von doppelten Zeilen nur eine zu behalten und mit -c zu zählen, wie oft sie vorkommen.
ℹ️ Affiliate-Hinweis
Die Inhalte dieser Website enthalten Affiliate-Links. Kauft ein Besucher über einen dieser Links ein Produkt oder eine Dienstleistung, erhält die Website vom Verkäufer eine Provision. Der Betrag, den der Käufer zahlt(bei Aktionsrabatten sinkt er ↓), steigt dadurch nicht. Angegebene Preise, Rabatte und Lagerbestände entsprechen dem Stand bei Erstellung und können abweichen; prüfe sie daher vor dem Kauf beim Verkäufer. Produkte werden nach eigenen Kriterien ausgewählt und bewertet, und Provisionen beeinflussen weder die Reihenfolge noch den Inhalt der Bewertungen.