[[Vorlage(Getestet, general)]] {{{#!vorlage Wissen [:Terminal:Ein Terminal öffnen] }}} [[Inhaltsverzeichnis(1)]] [[Bild(Wiki/Icons/terminal.png, 48, align=left)]] diff ist das Standardprogramm für die Kommandozeile zum Vergleichen des Inhalts von zwei Dateien. Es können aber auch Ordner verglichen werden, um herauszufinden, ob sie gleiche Dateien enthalten. Grafische Oberflächen und Alternativen sind im Artikel [:Textdateien vergleichen:] zusammengefasst. = Installation = diff ist Teil der GNU Diffutils * '''diffutils''' und in jeder Ubuntu- (bzw. Linux-)Installation enthalten. = Aufruf = Die allgemeine Syntax lautet [1]: {{{#!vorlage Befehl diff [OPTIONEN] DATEI1 DATEI2 }}} diff kennt folgende Optionen: {{{#!vorlage Tabelle Optionen von diff (Auswahl) +++ Option Beschreibung +++ `-q` für '''q'''uick, meldet, wenn Dateien unterschiedlich sind, unterdrückt aber die Ausgabe der Unterschiede. +++ `-s` für '''s'''ame, meldet wenn Dateien gleich sind. Mit `diff -qs` kann man die Ausgabe auf die reine Meldung beschränken. +++ `--help` Hilfe +++ `-r` für '''r'''ekursiv, 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 == * DATEI1: {{{gleich auch gleich wieder gleich Unterschied 1 Unterschied 2 Unterschied 5}}} * DATEI2: {{{gleich auch gleich wieder gleich Unterschied 3 Unterschied 4}}} {{{#!vorlage Befehl diff -q DATEI1 DATEI2 }}} {{{ Dateien '''DATEI1''' und '''DATEI2''' unterscheiden sich }}} {{{#!vorlage Befehl diff DATEI1 DATEI2 }}} {{{ 4,6c4,5 < Unterschied 1 < Unterschied 2 < Unterschied 5 --- > Unterschied 3 > Unterschied 4 }}} diff gibt an, was an DATEI1 geändert werden muss, damit sie mit DATEI2 identisch wird. Zuerst gibt diff an, in welcher Zeile sich die Unterschiede befinden. Im Beispiel wäre das "4,6c4,5" nämlich: Zeilen 4 bis (,) 6 müssen geändert (c) werden, damit sie mit den Zeilen 4 bis 5 in DATEI2 identisch werden. c steht dabei für Ändern (change), d steht für Löschen (delete) und a steht für Hinzufügen (add). Zeilen mit `<` sind in der ersten (linken) Datei vorhanden und Zeilen mit `>` in der zweiten (rechten). Vergleichen von Ordnern: {{{#!vorlage Befehl diff -s ORDNER1 ORDNER2 }}} {{{ Dateien ORDNER1/DATEI1 und ORDNER2/DATEI1 sind identisch Dateien ORDNER1/DATEI2 und ORDNER2/DATEI2 sind identisch Nur in ORDNER2: DATEI3 }}} Ausführlichere Beispiele (in Englisch) sind auf [http://www.computerhope.com/unix/udiff.htm Computer Hope] {en} zu finden. = 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:Patch] angewendet werden. Folgende Optionen von diff sind außerdem noch für das Erstellen einer Patchdatei interessant: {{{#!vorlage Tabelle Optionen von diff +++ Option Beschreibung +++ `-q` ignoriert in diesem Fall fehlende Dateien +++ `-u` für '''u'''nified, gibt `NUM` (Standard 3) der unveränderten Zeilen aus +++ `-N` für '''N'''ew, erstellt fehlende Dateien }}} == Beispiele == {{{#!vorlage Befehl diff -uNr ORIGINALDATEI VERBESSERTE_DATEI > DIFFDATEI.diff }}} Die Datei '''DIFFDATEI.diff''' würde dann in etwa so aussehen: {{{#!code diff --- 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. {{{#!vorlage Befehl diff -uNr ORDNER1 ORDNER2 > DIFFORDNER.diff }}} Der Inhalt der Datei DIFFORDNER.diff: {{{#!code 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. = Links = * [http://www.gnu.org/software/diffutils/ GNU Diffutils] {en} * [man:diff:Manpage] {en} * [wikipedia:diff:] * [:patch:] * [:Shell/Befehlsübersicht:] {Übersicht} Übersicht über verschiedene Shell-Befehle #tag: System, Shell