Diff: Unterschied zwischen den Versionen

Aus Foxwiki
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Zeile 481: Zeile 481:


[[Kategorie:Linux/Datei/Vergleich]]
[[Kategorie:Linux/Datei/Vergleich]]
[[Kategorie:Linux/Befehl]]
{{DEFAULTSORT:diff}}
{{DEFAULTSORT:diff}}

Version vom 16. April 2024, 11:46 Uhr


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 Exit-Status 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)