diff
ist ein Befehlszeilenprogramm, mit dem Sie zwei Dateien Zeile für Zeile vergleichen können. Es kann auch den Inhalt von Verzeichnissen vergleichen.
Der diff
Der Befehl wird am häufigsten verwendet, um einen Patch zu erstellen, der die Unterschiede zwischen einer oder mehreren Dateien enthält, die mit dem patch
angewendet werden können Befehl.
Wie man den diff
verwendet Befehl #
Die Syntax für den diff
Befehl lautet wie folgt:
diff [OPTION]... FILES
Der diff
Der Befehl kann die Ausgabe in mehreren Formaten anzeigen, wobei das normale, kontextbezogene und vereinheitlichte Format die gebräuchlichsten sind. Die Ausgabe enthält Informationen darüber, welche Zeilen in den Dateien geändert werden müssen, damit sie identisch werden. Wenn die Dateien übereinstimmen, wird keine Ausgabe erzeugt.
Um die Befehlsausgabe in einer Datei zu speichern, verwenden Sie den Umleitungsoperator:
diff file1 file2 > patch
In diesem Artikel verwenden wir die folgenden zwei Dateien, um zu erklären, wie der diff
Befehl funktioniert:
Ubuntu
Arch Linux
Debian
CentOS
Fedora
file2Kubuntu
Ubuntu
Debian
Arch Linux
Centos
Fedora
Normales Format #
In seiner einfachsten Form, wenn der diff
Befehl auf zwei Textdateien ohne Option ausgeführt wird, erzeugt er eine Ausgabe im normalen Format:
diff file1 file2
Die Ausgabe sieht in etwa so aus:
0a1
> Kubuntu
2d2
< Arch Linux
4c4,5
< CentOS
---
> Arch Linux
> Centos
Das normale Ausgabeformat besteht aus einem oder mehreren Abschnitten, die die Unterschiede beschreiben. Jeder Abschnitt sieht folgendermaßen aus:
change-command
< from-file-line...
---
> to-file-line...
0a1
, 2d2
und 4c4,5
sind Änderungsbefehle. Jeder Änderungsbefehl enthält von links nach rechts Folgendes:
- Die Zeilennummer oder der Zeilenbereich in der ersten Datei.
- Ein spezielles Änderungszeichen.
- Die Zeilennummer oder der Zeilenbereich in der zweiten Datei.
Das Änderungszeichen kann eines der folgenden sein:
a
- Fügen Sie die Zeilen hinzu.c
- Ändere die Zeilen.d
- Zeilen löschen.
Auf den Änderungsbefehl folgen die vollständigen Zeilen, die entfernt werden (<
) und der Datei hinzugefügt (>
).
Lassen Sie uns die Ausgabe erklären:
0a1
- Zeile1
hinzufügen der zweiten Datei am Anfang der Datei1 (nach der Zeile0
).> Kubuntu
- Die Zeile ab der zweiten Zeile, die wie oben beschrieben zur ersten Datei hinzugefügt wird.
2d2
- Zeile2
löschen in der ersten Datei. Die2
nach demd
Symbol bedeutet, dass, wenn die Zeile nicht gelöscht wird, sie in Zeile2
erscheinen würde in der zweiten Datei.< Arch Linux
- die gelöschte Zeile.
4c4,5
- Zeile5
ersetzen (ändern). in der ersten Datei mit den Zeilen4-5
aus der zweiten Datei.< CentOS
- Die Zeile in der ersten zu ersetzenden Datei.---
- Trennzeichen.> Arch Linux
und> Centos
- Zeilen aus der zweiten Datei, die die Zeile in der ersten Datei ersetzen.
Kontextformat #
Wenn das Kontextausgabeformat verwendet wird, ist der diff
Der Befehl zeigt mehrere Kontextzeilen um die Zeilen an, die sich zwischen den Dateien unterscheiden.
Das -c
Option teilt diff
mit um eine Ausgabe im Kontextformat zu erzeugen:
diff -c file1 file2
*** file1 2019-11-25 21:00:26.422426523 +0100
--- file2 2019-11-25 21:00:36.342231668 +0100
***************
*** 1,6 ****
Ubuntu
- Arch Linux
Debian
! CentOS
Fedora
--- 1,7 ----
+ Kubuntu
Ubuntu
Debian
! Arch Linux
! Centos
Fedora
Die Ausgabe beginnt mit den Namen und Zeitstempeln der verglichenen Dateien und einem oder mehreren Abschnitten, die die Unterschiede beschreiben. Jeder Abschnitt sieht folgendermaßen aus:
***************
*** from-file-line-numbers ****
from-file-line...
--- to-file-line-numbers ----
to-file-line...
from-file-line-numbers
undto-file-line-numbers
- Die Zeilennummern oder der durch Kommas getrennte Zeilenbereich in der ersten bzw. zweiten Datei.from-file-line
undto-file-line
- Die Zeilen, die sich unterscheiden, und die Kontextzeilen:- Zeilen, die mit zwei Leerzeichen beginnen, sind Kontextzeilen, die Zeilen, die in beiden Dateien gleich sind.
- Zeilen beginnend mit dem Minuszeichen (
-
) sind die Zeilen, die nichts in der zweiten Datei entsprechen. In der zweiten Datei fehlen Zeilen. - Zeilen beginnend mit dem Pluszeichen (
+
) sind die Zeilen, die nichts in der ersten Datei entsprechen. In der ersten Datei fehlen Zeilen. - Zeilen beginnend mit dem Ausrufezeichen (
!
) sind die Zeilen, die zwischen zwei Dateien geändert werden. Jede Gruppe von Zeilen beginnt mit!
aus der ersten Datei hat eine entsprechende Übereinstimmung in der zweiten Datei.
Lassen Sie uns die wichtigsten Teile der Ausgabe erklären:
- In diesem Beispiel haben wir nur einen Abschnitt, der die Unterschiede beschreibt.
*** 1,6 ****
und--- 1,7 ----
gibt uns den Zeilenbereich der ersten und zweiten Datei an, die in diesem Abschnitt enthalten sind.- Linien
Ubuntu
,Debian
,Fedora
, und die letzte leere Zeile sind in beiden Dateien gleich. Diese Zeilen beginnen mit einem doppelten Leerzeichen. - Zeile
- Arch Linux
aus der ersten Datei entspricht nichts in der zweiten Datei. Obwohl diese Zeile auch in der zweiten Datei vorhanden ist, sind die Positionen unterschiedlich. - Zeile
+ Kubuntu
aus der zweiten Datei entspricht nichts in der ersten Datei. - Zeile
! CentOS
aus der ersten Datei und Zeilen! Arch Linux
und! CentOS
aus der zweiten Datei werden zwischen den Dateien gewechselt.
Standardmäßig beträgt die Anzahl der Kontextzeilen drei. Um eine andere Nummer anzugeben, verwenden Sie -C
(--contexts
) Option:
diff -C 1 file1 file2
*** file1 2019-11-25 21:00:26.422426523 +0100
--- file2 2019-11-25 21:00:36.342231668 +0100
***************
*** 1,5 ****
Ubuntu
- Arch Linux
Debian
! CentOS
Fedora
--- 1,6 ----
+ Kubuntu
Ubuntu
Debian
! Arch Linux
! Centos
Fedora
Einheitliches Format #
Das vereinheitlichte Ausgabeformat ist eine verbesserte Version des Kontextformats und erzeugt eine kleinere Ausgabe.
Verwenden Sie das -u
Option, um diff
mitzuteilen um die Ausgabe im einheitlichen Format zu drucken:
diff -u file1 file2
--- file1 2019-11-25 21:00:26.422426523 +0100
+++ file2 2019-11-25 21:00:36.342231668 +0100
@@ -1,6 +1,7 @@
+Kubuntu
Ubuntu
-Arch Linux
Debian
-CentOS
+Arch Linux
+Centos
Fedora
Die Ausgabe beginnt mit den Namen und den Zeitstempeln der Dateien und einem oder mehreren Abschnitten, die die Unterschiede beschreiben. Jeder Abschnitt hat die folgende Form:
***************
@@ from-file-line-numbers to-file-line-numbers @@
line-from-files...
@@ from-file-line-numbers to-file-line-numbers @@
- Die Zeilennummer oder der Bereich der Zeilen aus der ersten und zweiten Datei, die in diesem Abschnitt enthalten sind.line-from-files
- Die Zeilen, die sich unterscheiden, und die Kontextzeilen:- Zeilen, die mit zwei Leerzeichen beginnen, sind Kontextzeilen, die Zeilen, die in beiden Dateien gleich sind.
- Zeilen beginnend mit dem Minuszeichen (
-
) sind die Zeilen, die entfernt werden aus der ersten Datei. - Zeilen beginnend mit dem Pluszeichen (
+
) sind die Zeilen, die hinzugefügt werden aus der ersten Datei.
Fall # ignorieren
Wie Sie vielleicht in den obigen Beispielen bemerkt haben, ist der diff
Beim Befehl wird standardmäßig zwischen Groß- und Kleinschreibung unterschieden.
Verwenden Sie das -i
Option, um diff
mitzuteilen Groß-/Kleinschreibung ignorieren:
diff -ui file1 file2
--- file1 2019-11-25 21:00:26.422426523 +0100
+++ file2 2019-11-25 21:00:36.342231668 +0100
@@ -1,6 +1,7 @@
+Kubuntu
Ubuntu
-Arch Linux
Debian
+Arch Linux
CentOS
Fedora
Schlussfolgerung #
Das Vergleichen von Textdateien auf Unterschiede ist eine der häufigsten Aufgaben für Linux-Systemadministratoren.
Der diff
Befehl vergleicht Dateien Zeile für Zeile. Geben Sie für weitere Informationen man diff
ein in Ihrem Terminal.
Wenn Sie Fragen haben, hinterlassen Sie bitte unten einen Kommentar.