diff
diff
Mit dem Programm diff kann man auf der Kommandozeile Dateien vergleichen. Die Befehlssyntax ist einfach:
diff Datei1 Datei2
Will man nur wissen ob eine Datei sich inhaltlich von einer anderen Datei unterscheidet, kann der Parameter q verwendet werden:
diff -q Datei1 Datei2
Unterscheiden sich die Dateien, gibt diff eine entsprechende Meldung aus, ansonsten erfolgt keine Ausgabe.
Dateien datei1 und datei2 sind verschieden.
Ohne den Parameter q zeigt diff die Unterschiede an, das sieht zum Beispiel so aus:
diff beispiel2 beispiel1 1,2c1,2 < Das ist ein Beispieltext für einen Blogartikel. < Diese Datei heisst beispiel2. --- > Das hier ist ein Beispieltext. > Diese Datei heisst beispiel1. 6C6 < Nicht eingerückter Text. --- > Eingerückter Text. 8A9,10 > > Mit noch mehr Text.
Diff zeigt immer an, was man in der zweiten Datei ändern müsste, damit sie der ersten Datei entspricht.
Die erste Zeile (1,2c1,2) bedeutet: Zeile 1 und Zeile 2 der zweiten Datei müssen verändert (c steht für change, das englische Wort für Ändern) werden, damit sie Zeile 1 und 2 der ersten Datei entsprechen. Außerdem wird der Inhalt der Zeilen angezeigt, so sieht man gleich was man ändern müsste. |
Datei:Grafik18.png |
Außer c für change gibt es noch a, das steht für Anhängen (append), und d für Löschen (delete). 8a9,10 bedeutet also, das hinter Zeile 8 noch Text eingefügt werden muss, nämlich die Zeilen 9 und 10 der zweiten Datei.
Ansicht ändern
Es gibt auch noch zwei andere Ausgabeformate. Das eine ist das Kontext-Format, dabei werden zu jeder Zeile, die verändert werden muss, auch noch die vorangehenden und folgenden 3 Zeilen angezeigt.
Die ersten beiden Zeilen geben an, welche Dateien verglichen werden, und das Inhalte aus der ersten Datei mittels Sternchen (***) und Inhalte aus der zweiten Zeile mittels Bindestrichen (---) gekennzeichnet werden.
$ diff -c beispiel2 beispiel1 *** beispiel2 2009-05-12 22:01:52.000000000 +0200 --- beispiel1 2009-05-12 20:26:48.000000000 +0200 *************** *** 1,8 **** ! Das ist ein Beispieltext für einen Blogartikel. ! Diese Datei heisst beispiel2. Lorem ipsum. ! Nicht eingerückter Text. Hier geht es noch weiter. --- 1,10 ---- ! Das hier ist ein Beispieltext. ! Diese Datei heisst beispiel1. Lorem ipsum. ! Eingerückter Text. Hier geht es noch weiter. + + Mit noch mehr Text.
Änderungen werden durch ein Ausrufezeichen, hinzuzufügende Zeilen mit einem Plus, zu entfernende Zeilen mit einem Minus gekennzeichnet.
Außerdem ist es möglich die Inhalte der beiden Dateien nebeneinander anzuzeigen.
$ diff -y beispiel2 beispiel1 Das ist ein Beispieltext für einen Blogartikel. | Das hier ist ein Beispieltext. Diese Datei heisst beispiel2. | Diese Datei heisst beispiel1. Lorem ipsum. Lorem ipsum. Nicht eingerückter Text. | Eingerückter Text. Hier geht es noch weiter. Hier geht es noch weiter. > > Mit noch mehr Text. Was kann diff noch?
Möchte man drei Dateien miteinander vergleichen kann man anstatt diff den Befehl diff3 verwenden.
$ diff3 beispiel1 beispiel2 beispiel3 ====1 1:1,2c Das hier ist ein Beispieltext. Diese Datei heisst beispiel1. 2:1,2c 3:1,2c Das ist ein Beispieltext für einen Blogartikel. Diese Datei heisst beispiel2.
Es ist auch möglich mit diff den Inhalt von Verzeichnissen zu vergleichen, diff zeigt dann an, welche Dateien nur in einem der beiden Verzeichnisse existieren. Der Parameter r weist diff an, auch Unterverzeichnisse zu überprüfen.
$ diff -r verz1 verz2 Nur in verz1: datei3.
Wenn man längere Texte miteinander vergleicht und die Ausgabe nicht mehr auf den Bildschirm passt kann man sie auch an ein Programm wie less übergeben:
diff datei1 datei2 | less
Anschließend kann man bequem durch die Ausgabe von diff scrollen.
Optionen
-q | für quick, gibt nur Unterschiede aus |
-s | für same, meldet wenn Dateien gleich sind |
--help | Hilfe |
-r | für rekursiv, vergleicht Unterverzeichnisse wenn vorhanden |
-y | tabellarische Ausgabe, auch gleiche Zeilen, ungleiche Zeilen werden markiert |
--suppress-common-lines | unterdrückt gleiche Zeilen |
-a | behandelt alle Dateien (z. B. binäre) wie Text |
-d | versucht mit erhöhtem Aufwand kleinere Veränderungen zu finden |
--speed-large-files | geht von großen Dateien und vielen, kleinen, verstreuten Veränderungen aus |
Beispiele
$ diff -q DATEI1 DATEI2 Dateien DATEI1 und DATEI2 unterscheiden sich diff DATEI1 DATEI2 4,6c4,5 < Unterschied 1 < Unterschied 2 < Unterschied 5 --- > Unterschied 3 > Unterschied 4
Zuerst gibt diff an, in welcher Zeile sich die Unterschiede befinden. Zeilen mit < sind in der ersten Datei vorhanden und Zeilen mit > in der zweiten.
Vergleichen von Ordnern:
$ diff -s ORDNER1 ORDNER2 Dateien ORDNER1/DATEI1 und ORDNER2/DATEI1 sind identisch Dateien ORDNER1/DATEI2 und ORDNER2/DATEI2 sind identisch Nur in ORDNER2: DATEI3
Patchdatei erstellen
Wer sich mit Programmierung, Bugs oder dem Verbessern von Programmen beschäftigt, benutzt diff um Änderungen per Versionsverwaltung mitzuteilen. Um nicht alle Codedateien mit Änderungen auszutauschen, werden nur die geänderten Stellen im Diff-Format gespeichert. Der so erstellte Diff kann dann als Patch (beispielsweise mit patch) angewandt werden.
Folgende Optionen von diff sind außerdem noch für das Erstellen einer Patchdatei interessant:
-q | ignoriert in diesem Fall fehlende Dateien |
-u | für unified, gibt NUM (Standard 3) der unveränderten Zeilen aus |
-N | für New, erstellt fehlende Dateien |
Beispiele
$ diff -uNr ORIGINALDATEI VERBESSERTE_DATEI > DIFFDATEI.diff
Die Datei DIFFDATEI.diff würde dann in etwa so aussehen:
--- a/ORIGINALDATEI +++ b/VERBESSERTE_DATEI @@ -1,8 +1,9 @@ Gleich 1 Gleich 2 Gleich 3 + Unterschied 1 + Unterschied 2 - Unterschied 3 - Unterschied 4 + Unterschied 5 Gleich 4 Gleich 5 Gleich 6
Nach Angabe der Dateien, in welcher Zeile man sich befindet und wie viele Zeilen es vorher und danach sind, kommen die drei gleichgebliebenen Zeilen. Die Angabe der Verzeichnisse (a/ und b/) dient nur als Platzhalter, falls Dateien bereits vorhanden sind. Zeilen mit + sind dazugekommen, Zeilen mit - weggenommen und Zeilen mit einem Leerzeichen " " gleichgeblieben.
diff -uNr ORDNER1 ORDNER2 > DIFFORDNER.diff
Der Inhalt der Datei DIFFORDNER.diff:
diff -uNr ORDNER1/DATEI3 ORDNER2/DATEI3 --- ORDNER1/DATEI3 +++ ORDNER2/DATEI3 @@ -0,0 +1,5 @@ + Unterschied 1 + Unterschied 2 + Unterschied 3 + Unterschied 4 + Unterschied 5
Hier wurden die Ordner verglichen und in den - und +-Zeilen mit angegeben. Da DATEI3 noch nicht in ORDNER1 vorhanden (0,0) ist, werden die Zeilen 1-5 einfach eingefügt.
Somit wird die Datei bei einem Anwenden von patch erstellt.
tmp
DIFF(1) Dienstprogramme für Benutzer DIFF(1)
BEZEICHNUNG GNU diff - Dateien zeilenweise vergleichen
ÜBERSICHT diff [OPTION]… DATEIEN
BESCHREIBUNG DATEIEN zeilenweise vergleichen
Die obligatorischen Argumente für Optionen sind für deren Kurz- und Langform gleich.
--normal
Ein normales Diff ausgeben (Voreinstellung)
-q, --brief
Nur melden, wenn sich Dateien unterscheiden
-s, --report-identical-files
Melden, wenn zwei Dateien gleich sind
-c, -C ANZAHL, --context[=ANZAHL]
ANZAHL Zeilen (Vorgabe 3) des kopierten Umfelds ausgeben
-u, -U ANZAHL, --unified[=ANZAHL]
ANZAHL Zeilen (Vorgabe 3) des vereinheitlichten Kontexts ausgeben
-e, --ed
Ein ed(1)-Skript ausgeben
-n, --rcs
Ein Diff im RCS-Format ausgeben
-y, --side-by-side
Zwei Spalten ausgeben
-W, --width=ANZAHL
Höchstens ANZAHL Spalten (Vorgabe 130) ausgeben
--left-column
Nur die linke Spalte von gemeinsamen Zeilen ausgeben
--suppress-common-lines
Gemeinsame Zeilen nicht ausgeben
-p, --show-c-function
Für jede Änderung die entsprechende C-Funktion zeigen
-F, --show-function-line=REGULÄRER_AUSDRUCK
Die letzte Zeile zeigen, auf die REGULÄRER_AUSDRUCK passt
--label BESCHRIFTUNG
BESCHRIFTUNG an Stelle des Dateinamens und Zeitstempels benutzen (kann wiederholt werden)
-t, --expand-tabs
Tabulatoren in der Ausgabe durch Leerzeichen ersetzen
-T, --initial-tab
Tabulatoren durch Voranstellen von Tabulatoren ausgleichen
--tabsize=ANZAHL
Tabulator-Stopps befinden sich nach je ANZAHL (Vorgabe 8) Ausgabespalten
--suppress-blank-empty
Leerzeichen oder Tabulatoren vor leeren Ausgabezeilen unterdrücken
-l, --paginate
Die Ausgabe durch pr(1) leiten, um die Seiten zu nummerieren
-r, --recursive
Alle gefundenen Unterverzeichnisse rekursiv vergleichen
--no-dereference
Symbolischen Links nicht folgen
-N, --new-file
Fehlende Dateien als leer behandeln
--unidirectional-new-file
Fehlende erste Dateien als leer behandeln
--ignore-file-name-case
Ignoriert beim Vergleich von Dateinamen Groß- und Kleinschreibung
--no-ignore-file-name-case
Beachtet beim Vergleich von Dateinamen Groß- und Kleinschreibung
-x, --exclude=MUSTER
Dateien ausschließen, die auf MUSTER passen
-X, --exclude-from=DATEI
Dateien ausschließen, die auf irgendein Muster in DATEI passen
-S, --starting-file=DATEI
Beim Vergleich von Verzeichnissen mit DATEI beginnen
--from-file=DATEI1
DATEI1 mit allen Operanden vergleichen. DATEI1 kann ein Verzeichnis sein.
--to-file=DATEI2
Alle Operanden mit DATEI2 vergleichen. DATEI2 kann ein Verzeichnis sein.
-i, --ignore-case
Ignoriert unterschiedliche Groß- und Kleinschreibung im Dateiinhalt
-E, --ignore-tab-expansion
Änderungen auf Grund von Tabulator-Expansion ignorieren
-Z, --ignore-trailing-space
Alle Leerräume am Zeilenende ignorieren
-b, --ignore-space-change
Änderungen der Anzahl von Leerräumen ignorieren
-w, --ignore-all-space
Alle Leerräume ignorieren
-B, --ignore-blank-lines
Änderungen ignorieren, die nur leere Zeilen betreffen
-I, --ignore-matching-lines=REGULÄRER_AUSDRUCK
Änderungen ignorieren, deren Zeilen alle auf REGULÄRER_AUSDRUCK passen
-a, --text
Alle Dateien als Text behandeln
--strip-trailing-cr
Wagenrücklauf (Carriage Return) am Ende der Eingabe entfernen
-D, --ifdef=NAME
Zusammengefügte Datei mit »#ifdef NAME«-Diffs ausgeben
--GTYPE-group-format=GFMT
GTYPE-Eingabegruppen mit GFMT formatieren
--line-format=LFMT
Alle Eingabezeilen mit LFMT formatieren
--LTYPE-line-format=LFMT
Alle LTYPE-Eingabezeilen mit LFMT formatieren
Mit den folgenden Optionen, einer Verallgemeinerung von
-D/--ifdef, können Sie die Formatierung der Ausgabe von diff detailliert festlegen.
LTYPE kann »old«, »new« oder »unchanged« sein.
GTYPE ist LTYPE oder »changed«.
GFMT darf (nur) Folgendes enthalten:
%< Zeilen aus DATEI1
%> Zeilen aus DATEI2
%= Gemeinsame Zeilen von DATEI1 und DATEI2
%[-][BREITE][.[PRÄZ]]{doxX}BUCHSTABE
Angabe im printf(1)-Stil für BUCHSTABE
BUCHSTABEn sind für neue Gruppe, Kleinschreibung und alte Gruppe wie folgt:
F Erste Zeilennummer
L Letzte Zeilennummer
N Anzahl der Zeilen = L-F+1
E F-1
M L+1
%(A=B?T:E)
Wenn A gleich B ist, dann T, sonst E
LFMT darf (nur) Folgendes enthalten:
%L Inhalt der Zeile
%l Inhalt der Zeile, außer irgendwelchen führenden Zeilenumbrüchen
%[-][BREITE][.[PRÄZ]]{doxX}n
Angabe im printf(1)-Stil für Eingabe-Zeilennummer
Sowohl GFMT als auch LFMT dürfen Folgendes enthalten:
%% %
%c»C« Das einzelne Zeichen C
%c»\OOO«
Das Zeichen mit dem oktalen Code 000
C Das Zeichen C (andere Zeichen stellen sich selbst dar)
-d, --minimal
Intensive Suche nach einer kleineren Menge von Änderungen
--horizon-lines=ANZAHL
ANZAHL Zeilen des üblichen Präfix und der Endung behalten
--speed-large-files
Große Dateien und viele vereinzelte kleine Änderungen annehmen
--color[=WANN]
Farben bei der Ausgabe verwenden; WANN kann die Werte »never«, »always« oder »auto« (Voreinstellung) annehmen
--palette=PALETTE
Die Farben, die verwandt werden sollen, wenn --color aktiv ist. PALETTE ist eine durch Doppelpunkte getrennte Liste von »terminfo capabili‐ ties«
--help zeigt Hilfeinformationen an und beendet das Programm.
-v, --version
gibt Versionsinformationen aus und beendet das Programm.
DATEIEN sind »DATEI1 DATEI2« oder »VERZEICHNIS1 VERZEICHNIS2« oder »VERZEICHNIS DATEI« oder »DATEI VERZEICHNIS«. Falls --from-file oder --to-file an‐ gegeben ist, gibt es keine Einschränkungen für DATEI(en). Falls eine DATEI »-« ist, wird die Standardeingabe gelesen. Der Rückgabewert ist 0, wenn die Eingaben gleich sind, 1, wenn verschieden und 2 bei Problemen.
AUTOR Geschrieben von Paul Eggert, Mike Haertel, David Hayes, Richard Stallman und Len Tower.
FEHLER MELDEN Melden Sie Fehler (auf Englisch) an ⟨bug-diffutils@gnu.org⟩. Homepage der GNU diffutils: ⟨https://www.gnu.org/software/diffutils/⟩ Allgemeine Hilfe zur Benutzung von GNU-Software: ⟨https://www.gnu.org/gethelp/⟩
COPYRIGHT Copyright © 2018 Free Software Foundation, Inc. Lizenz GPLv3+: GNU GPL Version 3 ⟨https://gnu.org/licenses/gpl.html⟩ oder neuer. Dies ist freie Software: Sie können sie verändern und weitergeben. Es gibt KEINE GARANTIE, soweit gesetzlich zulässig.
SIEHE AUCH wdiff(1), cmp(1), diff3(1), sdiff(1), patch(1)
Die vollständige Dokumentation für diff wird als Texinfo-Handbuch gepflegt. Wenn die Programme info(1) und diff auf Ihrem Rechner ordnungsgemäß in‐ stalliert sind, können Sie mit dem Befehl
info diff
auf das vollständige Handbuch zugreifen.
ÜBERSETZUNG Die deutsche Übersetzung dieser Handbuchseite wurde von Michael Piefel <piefel@debian.org>, Chris Leick <c.leick@vollbio.de>, Dr. Tobias Quathamer <toddy@debian.org> und Mario Blättermann <mario.blaettermann@gmail.com> erstellt.
Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.
Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Übersetzer ⟨debian-l10n- german@lists.debian.org⟩.
diffutils 3.7 Dezember 2018 DIFF(1)