diff: Unterschied zwischen den Versionen

Aus Mikiwiki
Zur Navigation springen Zur Suche springen
 
(15 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
Der [[Shell-Befehl]] <b>diff</b> ist ein [[Textvergleichswerkzeug]] und vergleicht zeilenweise zwei Textdateien oder den Inhalt von zwei Verzeichnissen, zeigt auf der Konsole die Unterschiede und schreibt die Änderungsvorschläge auf Wunsch in eine Patchdatei, mit der die gewünschte Datei vollautomatisch angepasst werden kann. Zur Arbeit mit drei Dateien wird [[diff3]] verwendet.
Der [[Shell-Befehl]] <b>diff</b> aus dem Paket [[Diffutils]] ist ein [[Textvergleichsprogramm]] und vergleicht zeilenweise zwei Textdateien oder den Inhalt von zwei Verzeichnissen, zeigt auf der Konsole die Unterschiede und schreibt die Änderungsvorschläge auf Wunsch in eine Patchdatei, mit der die gewünschte Datei vollautomatisch angepasst werden kann. Zur Arbeit mit drei Dateien wird [[diff3]] verwendet.


Das in Python und GTK entwickelte Programm [http://meld.sourceforge.net/ Meld] bietet unter einer grafischen Oberfläche kombiniert die Funktionen von diff und [[merge]], es können damit also die optisch hervorgehobenen Unterschiede in Textdateien sofort erkannt und mit der Maus hin- und hergeschoben werden.
Das in Python und GTK entwickelte Programm [http://meld.sourceforge.net/ Meld] bietet unter einer grafischen Oberfläche kombiniert die Funktionen von diff und [[merge]], es können damit also die optisch hervorgehobenen Unterschiede in Textdateien sofort erkannt und mit der Maus hin- und hergeschoben werden.


Grafische Oberflächen für diff bieten die Programme [[Beediff]], [[Diffuse]], [[Kdiff3]], [[Meld]], [[TkDiff]] und [[Xxdiff]].
Grafische Oberflächen für diff bieten die Programme [[Beediff]], [[Diffuse]], [[Kdiff3]], [[Meld]], [[Tkdiff]] und [[Xxdiff]].
 
Der Shell-Befehl [[diffpdf]] eignet sich zum Vergleich zweier PDF-Dateien.


== Arbeitsweise ==
== Arbeitsweise ==
Zeile 34: Zeile 36:
== Optionen ==
== Optionen ==


{| class=wikitable
{| class=wiki
! width=10% | Option !! Beschreibung
! width=10% | Option !! Beschreibung
|-
|-
Zeile 42: Zeile 44:
|-
|-
| <tt>-b</tt> || Einfache Leerzeichen nicht beachtet.
| <tt>-b</tt> || Einfache Leerzeichen nicht beachtet.
|-
| <tt>-c</tt> || Zeigt mehr Kontext, um die Ausgabe lesbarer zu machen.
|-
| <tt>-i</tt> || Gross- und Kleinschreibung wird nicht beachtet.
|-
| <tt>-q</tt> || Angezeigt werden nur die Dateinamen sich unterscheidender Dateien, aber nicht die tatsächlichen Unterschiede in diesen Dateien.
|-
| <tt>-r</tt> || Rekursiver Vergleich zweier Verzeichnisse.
|-
|-
| <tt>-w</tt> || Sämtliche Leerzeichen werden nicht beachtet.
| <tt>-w</tt> || Sämtliche Leerzeichen werden nicht beachtet.
|-
|-
| <tt>-i</tt> || Gross- und Kleinschreibung wird nicht beachtet.
| <tt>-y</tt> || Anzeige der Ausgabe nebeneinander anstatt untereinander.
|}
|}


Zeile 52: Zeile 62:
=== Vergleichen von Dateien ===
=== Vergleichen von Dateien ===


  $ <b>more file1</b>
  $ <b>more datei1</b>
  ABC
  ABC
  CDE
  CDE
  EFG
  EFG
  FGH
  FGH
  $ <b>more file2</b>
  $ <b>more datei2</b>
  ABC
  ABC
  EFG
  EFG
Zeile 63: Zeile 73:
  XYZ
  XYZ


Vergleich der Dateien "file1" und "file2". Das Kleiner-Zeichen ("<") zeigt die nur in der Datei "file1" vorkommenden Zeilen, das Grösser-Zeichen (">") zeigt die nur in der Datei "file2" vorkommenden Zeilen. Ausserdem wird hinter den Zeilen aus der Datei "file1" eine Zeile mit drei Minuszeichen ("---") eingefügt, falls im selben Block Informationen aus der Datei "file2" folgen.<br>
Vergleich der Dateien "datei1" und "datei2". Das Kleiner-Zeichen ("<") zeigt die nur in der Datei "datei1" vorkommenden Zeilen, das Grösser-Zeichen (">") zeigt die nur in der Datei "datei2" vorkommenden Zeilen. Ausserdem wird hinter den Zeilen aus der Datei "datei1" eine Zeile mit drei Minuszeichen ("---") eingefügt, falls im selben Block Informationen aus der Datei "datei2" folgen.<br>
 
$ <b>diff datei1 datei2</b>
2d1
< CDE
4c3,4
< FGH
---
> OPQ
> XYZ
 
Vergleich der Dateien "datei1" und "datei2", wobei nur die ersten 20'000 Zeilen beider Dateien verglichen werden.
 
$ <b>diff <(head -n 20000 datei1) <(head -n 20000 datei2)</b>


  $ <b>diff file1 file2</b>
Die Dateien "datei1" und "datei2" können auch verglichen werden, wenn sie sich auf verschiedenen Rechnern befinden, z. B. "datei1" auf dem lokalen Rechner und "datei2" auf dem Rechner "hermes".
 
  $ <b>cat datei1 | ssh hermes diff - datei2</b>
abc@hermes's password:
  2d1
  2d1
  < CDE
  < CDE
Zeile 76: Zeile 102:
Ausgabe mit mehr Format und standardmässig drei Zeilen Kontext. Als erstes werden die Namen der beiden Dateien sowie das Datum der letzten Änderung angezeigt. Die erste Datei wird mit Sternchen ("*"), die zweite mit Bindestrichen ("-") gekennzeichnet. Zeilen, die einen UNterschied aufweisen, haben ein Ausrufezeichen ("!") vornagestellt; Dinge die übereinstimmen tragen keine Markierung; neue Abschnitte tragen ein Pluszeichen; nicht mehr vorhandene Zeilen sind mit einem Minuszeichen gekennzeichnet.
Ausgabe mit mehr Format und standardmässig drei Zeilen Kontext. Als erstes werden die Namen der beiden Dateien sowie das Datum der letzten Änderung angezeigt. Die erste Datei wird mit Sternchen ("*"), die zweite mit Bindestrichen ("-") gekennzeichnet. Zeilen, die einen UNterschied aufweisen, haben ein Ausrufezeichen ("!") vornagestellt; Dinge die übereinstimmen tragen keine Markierung; neue Abschnitte tragen ein Pluszeichen; nicht mehr vorhandene Zeilen sind mit einem Minuszeichen gekennzeichnet.


  diff -c file1 file2
  $ <b>diff -c datei1 datei2</b>
  *** file1      2007-04-02 17:03:16.000000000 +0200
  *** datei1      2007-04-02 17:03:16.000000000 +0200
  --- file2      2007-04-02 17:00:16.000000000 +0200
  --- datei2      2007-04-02 17:00:16.000000000 +0200
  ***************
  ***************
  *** 1,4 ****
  *** 1,4 ****
Zeile 91: Zeile 117:
  ! XYZ
  ! XYZ


Anzeige der Unterschiede zwischen Datei "file1" und Datei "file2" nebeneinander und Markierung der Zeilen, in denen die Datei "file2" von Datei "file1" abweicht. Die Zeilenbreite beträgt standardmässig 130 Zeichen.
Anzeige der Unterschiede zwischen Datei "datei1" und Datei "datei2" nebeneinander und Markierung der Zeilen, in denen die Datei "datei2" von Datei "datei1" abweicht. Die Zeilenbreite beträgt standardmässig 130 Zeichen.


  $ <b>diff -y file1 file2</b>
  $ <b>diff -y datei1 datei2</b>
  ABC                                                            ABC
  ABC                                                            ABC
  CDE                                                          <
  CDE                                                          <
Zeile 100: Zeile 126:
                                                               > XYZ
                                                               > XYZ


Anzeige der Unterschiede zwischen der Datei "file1" und der Datei "file2" nebeneinander und Markierung der Zeilen, in denen die Datei "file2" von Datei "file1" abweicht. Die Zeilenbreite beträgt 90 Zeichen.
Anzeige der Unterschiede zwischen der Datei "datei1" und der Datei "datei2" nebeneinander und Markierung der Zeilen, in denen die Datei "datei2" von Datei "datei1" abweicht. Die Zeilenbreite beträgt 90 Zeichen.


  $ <b>diff -y -W 90 file1 file2</b>
  $ <b>diff -y -W 90 datei1 datei2</b>
  ABC                                            ABC
  ABC                                            ABC
  CDE                                        <
  CDE                                        <
Zeile 109: Zeile 135:
                                             >  XYZ
                                             >  XYZ


Anzeige der Unterschiede zwischen der Datei "file1" und der Datei "file2" nebeneinander und Markierung der Zeilen, in denen die Datei "file2" von Datei "file1" abweicht. Gemeinsame Zeilen werden nicht angezeigt. Die Zeilenbreite beträgt 90 Zeichen.
Anzeige der Unterschiede zwischen der Datei "datei1" und der Datei "datei2" nebeneinander und Markierung der Zeilen, in denen die Datei "datei2" von Datei "datei1" abweicht. Gemeinsame Zeilen werden nicht angezeigt. Die Zeilenbreite beträgt 90 Zeichen.


  $ <b>diff -y --suppress-common-lines -W 90 file1 file2</b>
  $ <b>diff -y --suppress-common-lines -W 90 datei1 datei2</b>
  CDE                                        <
  CDE                                        <
  FGH                                        |  OPQ
  FGH                                        |  OPQ
                                             >  XYZ
                                             >  XYZ
 
Generierung von [[ed]]-Output:
Erzeugung einer [[ed]]-Ausgabe.


  $ <b>diff -e foo bar</b>
  $ <b>diff -e foo bar</b>
Zeile 123: Zeile 149:
  .
  .


Darstellung der Unterschiede zwischen den Dateien "file1" und "file2" nebeneinander. Dabei werden höchstens 80 Druckspalten pro Zeile ausgegeben.
Darstellung der Unterschiede zwischen den Dateien "datei1" und "datei2" nebeneinander. Dabei werden höchstens 80 Druckspalten pro Zeile ausgegeben.


  $ <b>sdiff -w 80 file1 file2</b>
  $ <b>sdiff -w 80 datei1 datei2</b>


=== Vergleichen von Verzeichnissen ===
=== Vergleichen von Verzeichnissen ===


Wird diff mit zwei Verzeichnisnamen aufgerufen, so wird jede DAtei verglichen, die in beiden Verzeichnissen auftaucht. Alternativ kann diff ein Datei- und Verzeichnisname übergeben werden. Im angegebenen Verzeichnis wird dann nach der Datei gesucht und der Vergleich im Erfolgsfall gestartet. Wenn zwei Dateien übereinstimmen, schweigt sich diff aus.
Wird diff mit zwei Verzeichnisnamen aufgerufen, so wird jede Datei verglichen, die in beiden Verzeichnissen auftaucht. Alternativ kann diff ein Datei- und Verzeichnisname übergeben werden. Im angegebenen Verzeichnis wird dann nach der Datei gesucht und der Vergleich im Erfolgsfall gestartet. Wenn zwei Dateien übereinstimmen, schweigt sich diff aus.


=== Verwendung von Patches ===
=== Verwendung von Patches ===


Erstellung einer Ausgabe im "Unified Format" - diese Ausgabe wird auch als "Patch" (dt. Flicken) bezeichnet. In der Ausgabedatei "patchfile" erscheinen beide Dateinamen untereinander und zeigen das Datum der letzten Änderung sowie drei Zeilen Kontext.
Erstellung einer Ausgabe im "Unified Format" - diese Ausgabe wird auch als "Patch" (dt. Flick) bezeichnet. In der Ausgabedatei "flickdatei" erscheinen beide Dateinamen untereinander und zeigen das Datum der letzten Änderung sowie drei Zeilen Kontext.


  $ <b>diff -u file1 file2 > patchfile</b>
  $ <b>diff -u datei1 datei2 > flickdatei</b>
  $ <b>more patchfile</b>
$ <b>cat datei1</b>
  --- file1      2007-04-02 17:03:16.000000000 +0200
ABC
  +++ file2      2007-04-02 17:00:16.000000000 +0200
CDE
EFG
FGH
$ <b>cat datei2</b>
ABC
EFG
OPQ
XYZ
  $ <b>more flickdatei</b>
  --- datei1      2007-04-02 17:03:16.000000000 +0200
  +++ datei2      2007-04-02 17:00:16.000000000 +0200
  @@ -1,4 +1,4 @@
  @@ -1,4 +1,4 @@
   ABC
   ABC
Zeile 147: Zeile 183:
  +XYZ
  +XYZ


Anbringen des Patch, wobei vor dem Einspielen der Änderung eine Sicherung der Originaldatei ("-b") angelegt wird. Das heisst, von der Datei "file1" wird die Sicherungsdatei "file1.orig" angelegt, danach die Datei "file1" so gepatcht, dass ihr Inhalt derjenigen von Datei "file2" entspricht.
Anbringen des Flicks, wobei vor dem Einspielen der Änderung eine Sicherung der Originaldatei ("-b") angelegt wird. Das heisst, von der Datei "datei1" wird die Sicherungsdatei "datei.orig" angelegt, danach die Datei "datei1" so geflickt, dass ihr Inhalt dem ursprünglichen Inhalt von Datei "datei2" entspricht.


  $ <b>patch -b < patchfile</b>
  $ <b>patch -b < flickdatei</b>
  patching file file1
  patching file datei1
$ <b>cat datei1</b>
ABC
EFG
OPQ
XYZ


Die Datei "file2" wird mit Hilfe der Datei "patchfile" so verändert, dass ihr Inhalt dem der Datei "file1" entspricht. Pfadbezeichnungen werden dabei nicht verändert.
Die Datei "datei2" wird mit Hilfe der Datei "flickdatei" so verändert, dass ihr Inhalt dem ursprünglichen Inhalt der Datei "datei1" entspricht. Pfadbezeichnungen werden dabei nicht verändert.


  $ <b>patch -p0 file2 > patchfile</b>
  $ <b>patch -p0 datei2 < flickdatei</b>
patching file datei2
Reversed (or previously applied) patch detected!  Assume -R? [n] <b>y</b>
$ <b>cat datei2</b>
ABC
CDE
EFG
FGH


== Weblinks ==
== Weblinks ==


{{dewi|diff|diff}}
{{Weblinks}}
{{enwi|diff|diff}}
{{url_dewikipedia|diff|diff}}
* [http://www.softpanorama.org/Utilities/diff_tools.shtml Diff and other tools for detecting changes in sources] (Softpanorama.org)
{{url_enwikipedia|diff|diff}}
{{url|US|Softpanorama|eng|http://www.softpanorama.org/Utilities/diff_tools.shtml|Diff and other tools for detecting changes in sources}}
{{Fuss}}





Aktuelle Version vom 13. Mai 2021, 13:04 Uhr

Der Shell-Befehl diff aus dem Paket Diffutils ist ein Textvergleichsprogramm und vergleicht zeilenweise zwei Textdateien oder den Inhalt von zwei Verzeichnissen, zeigt auf der Konsole die Unterschiede und schreibt die Änderungsvorschläge auf Wunsch in eine Patchdatei, mit der die gewünschte Datei vollautomatisch angepasst werden kann. Zur Arbeit mit drei Dateien wird diff3 verwendet.

Das in Python und GTK entwickelte Programm Meld bietet unter einer grafischen Oberfläche kombiniert die Funktionen von diff und merge, es können damit also die optisch hervorgehobenen Unterschiede in Textdateien sofort erkannt und mit der Maus hin- und hergeschoben werden.

Grafische Oberflächen für diff bieten die Programme Beediff, Diffuse, Kdiff3, Meld, Tkdiff und Xxdiff.

Der Shell-Befehl diffpdf eignet sich zum Vergleich zweier PDF-Dateien.

Arbeitsweise

Die Ausgabe von diff besteht aus Kontextzeilen aus beiden Dateien, wobei der Text aus der ersten Datei durch das Symbol "<" markiert ist, der Text aus der zweiten Datei durch das Symbol ">".

Neben den Zeilen, die sich voneinander unterscheiden, wird auch eine Angabe gemacht, die verrät, was geändert werden muss, damit die Dateien sich nicht mehr unterscheiden. Diese Änderungsvorschläge folgen immer demselben Schema: neben der Zeilennummer oder einem Bereich (Zeilennummer durch Kommata getrennt) steht hier einer der drei Buchstaben "a", "c" oder "d":

  • a steht für "append" (anhängen)
  • c steht für "change" (verändern)
  • d steht für "delete" (löschen)

Folgende Zeile bedeutet, dass die Zeilen 9 bis 12 der ersten Datei oder die Zeilen 9 bis 13 der zweiten Datei verändert werden müssen, damit sich die beiden Dateien nicht mehr voneinander unterscheiden.

9,12c9,13

Folgende Zeile bedeutet, dass die Zeilen 13 und 15 der zweiten Datei hinter Zeile 3 der ersten eingefügt werden muss, damit sich die beiden Dateien nicht mehr voneinander unterscheiden.

3a,13,15

Folgende Zeile bedeutet, dass die Zeilen 4 bis 7 der ersten Datei gelöscht oder entsprechend nach Zeile 8 der zweiten Datei angehängt werden müssen, damit sich die beiden Dateien nicht mehr voneinander unterscheiden.

4-7,d8

Optionen

Option Beschreibung
-B Leerzeilen werden nicht beachtet.
-E Tabulatoren werden nicht beachtet.
-b Einfache Leerzeichen nicht beachtet.
-c Zeigt mehr Kontext, um die Ausgabe lesbarer zu machen.
-i Gross- und Kleinschreibung wird nicht beachtet.
-q Angezeigt werden nur die Dateinamen sich unterscheidender Dateien, aber nicht die tatsächlichen Unterschiede in diesen Dateien.
-r Rekursiver Vergleich zweier Verzeichnisse.
-w Sämtliche Leerzeichen werden nicht beachtet.
-y Anzeige der Ausgabe nebeneinander anstatt untereinander.

Verwendung

Vergleichen von Dateien

$ more datei1
ABC
CDE
EFG
FGH
$ more datei2
ABC
EFG
OPQ
XYZ

Vergleich der Dateien "datei1" und "datei2". Das Kleiner-Zeichen ("<") zeigt die nur in der Datei "datei1" vorkommenden Zeilen, das Grösser-Zeichen (">") zeigt die nur in der Datei "datei2" vorkommenden Zeilen. Ausserdem wird hinter den Zeilen aus der Datei "datei1" eine Zeile mit drei Minuszeichen ("---") eingefügt, falls im selben Block Informationen aus der Datei "datei2" folgen.

$ diff datei1 datei2
2d1
< CDE
4c3,4
< FGH
---
> OPQ
> XYZ

Vergleich der Dateien "datei1" und "datei2", wobei nur die ersten 20'000 Zeilen beider Dateien verglichen werden.

$ diff <(head -n 20000 datei1) <(head -n 20000 datei2)

Die Dateien "datei1" und "datei2" können auch verglichen werden, wenn sie sich auf verschiedenen Rechnern befinden, z. B. "datei1" auf dem lokalen Rechner und "datei2" auf dem Rechner "hermes".

$ cat datei1 | ssh hermes diff - datei2
abc@hermes's password: 
2d1
< CDE
4c3,4
< FGH
---
> OPQ
> XYZ

Ausgabe mit mehr Format und standardmässig drei Zeilen Kontext. Als erstes werden die Namen der beiden Dateien sowie das Datum der letzten Änderung angezeigt. Die erste Datei wird mit Sternchen ("*"), die zweite mit Bindestrichen ("-") gekennzeichnet. Zeilen, die einen UNterschied aufweisen, haben ein Ausrufezeichen ("!") vornagestellt; Dinge die übereinstimmen tragen keine Markierung; neue Abschnitte tragen ein Pluszeichen; nicht mehr vorhandene Zeilen sind mit einem Minuszeichen gekennzeichnet.

$ diff -c datei1 datei2
*** datei1      2007-04-02 17:03:16.000000000 +0200
--- datei2      2007-04-02 17:00:16.000000000 +0200
***************
*** 1,4 ****
  ABC
- CDE
  EFG
! FGH
--- 1,4 ----
  ABC
  EFG
! OPQ
! XYZ

Anzeige der Unterschiede zwischen Datei "datei1" und Datei "datei2" nebeneinander und Markierung der Zeilen, in denen die Datei "datei2" von Datei "datei1" abweicht. Die Zeilenbreite beträgt standardmässig 130 Zeichen.

$ diff -y datei1 datei2
ABC                                                             ABC
CDE                                                           <
EFG                                                             EFG
FGH                                                           | OPQ
                                                              > XYZ

Anzeige der Unterschiede zwischen der Datei "datei1" und der Datei "datei2" nebeneinander und Markierung der Zeilen, in denen die Datei "datei2" von Datei "datei1" abweicht. Die Zeilenbreite beträgt 90 Zeichen.

$ diff -y -W 90 datei1 datei2
ABC                                             ABC
CDE                                         <
EFG                                             EFG
FGH                                         |   OPQ
                                            >   XYZ

Anzeige der Unterschiede zwischen der Datei "datei1" und der Datei "datei2" nebeneinander und Markierung der Zeilen, in denen die Datei "datei2" von Datei "datei1" abweicht. Gemeinsame Zeilen werden nicht angezeigt. Die Zeilenbreite beträgt 90 Zeichen.

$ diff -y --suppress-common-lines -W 90 datei1 datei2
CDE                                         <
FGH                                         |   OPQ
                                            >   XYZ

Erzeugung einer ed-Ausgabe.

$ diff -e foo bar
1c
bar
.

Darstellung der Unterschiede zwischen den Dateien "datei1" und "datei2" nebeneinander. Dabei werden höchstens 80 Druckspalten pro Zeile ausgegeben.

$ sdiff -w 80 datei1 datei2

Vergleichen von Verzeichnissen

Wird diff mit zwei Verzeichnisnamen aufgerufen, so wird jede Datei verglichen, die in beiden Verzeichnissen auftaucht. Alternativ kann diff ein Datei- und Verzeichnisname übergeben werden. Im angegebenen Verzeichnis wird dann nach der Datei gesucht und der Vergleich im Erfolgsfall gestartet. Wenn zwei Dateien übereinstimmen, schweigt sich diff aus.

Verwendung von Patches

Erstellung einer Ausgabe im "Unified Format" - diese Ausgabe wird auch als "Patch" (dt. Flick) bezeichnet. In der Ausgabedatei "flickdatei" erscheinen beide Dateinamen untereinander und zeigen das Datum der letzten Änderung sowie drei Zeilen Kontext.

$ diff -u datei1 datei2 > flickdatei
$ cat datei1
ABC
CDE
EFG
FGH
$ cat datei2
ABC
EFG
OPQ
XYZ
$ more flickdatei
--- datei1      2007-04-02 17:03:16.000000000 +0200
+++ datei2      2007-04-02 17:00:16.000000000 +0200
@@ -1,4 +1,4 @@
 ABC
-CDE
 EFG
-FGH
+OPQ
+XYZ

Anbringen des Flicks, wobei vor dem Einspielen der Änderung eine Sicherung der Originaldatei ("-b") angelegt wird. Das heisst, von der Datei "datei1" wird die Sicherungsdatei "datei.orig" angelegt, danach die Datei "datei1" so geflickt, dass ihr Inhalt dem ursprünglichen Inhalt von Datei "datei2" entspricht.

$ patch -b < flickdatei
patching file datei1
$ cat datei1
ABC
EFG
OPQ
XYZ

Die Datei "datei2" wird mit Hilfe der Datei "flickdatei" so verändert, dass ihr Inhalt dem ursprünglichen Inhalt der Datei "datei1" entspricht. Pfadbezeichnungen werden dabei nicht verändert.

$ patch -p0 datei2 < flickdatei
patching file datei2
Reversed (or previously applied) patch detected!  Assume -R? [n] y
$ cat datei2
ABC
CDE
EFG
FGH

Weblinks

Herausgeber Sprache Webseitentitel Anmerkungen
Wikipedia ger diffwbm Enzyklopädischer Artikel
Wikipedia eng diffwbm Enzyklopädischer Artikel
Softpanorama eng Diff and other tools for detecting changes in sourceswbm