Weiterlesen mit NEWS. Jetzt testen.
Lesezeit ca. 7 Min.

Diff-Varianten: Spurensuche


LinuxUser - epaper ⋅ Ausgabe 2/2020 vom 16.01.2020

Welche Version einer Datei liegt vor? Die passenden Tools beantworten diese Frage mit nur einem Kommando.


Artikelbild für den Artikel "Diff-Varianten: Spurensuche" aus der Ausgabe 2/2020 von LinuxUser. Dieses epaper sofort kaufen oder online lesen mit der Zeitschriften-Flatrate United Kiosk NEWS.

Bildquelle: LinuxUser, Ausgabe 2/2020

© Alexei Novikov, 123RF

Gleich von Anfang an lohnt es sich, mit der alten Mär aufzuräumen, dass Sie Unterschiede zwischen Dateien bereits an deren Größe erkennen. Das mag gelegentlich zwar stimmen, aber eine Garantie dafür gibt es nicht. Listing 1 zeigt drei gleich große Dateien. In 2.txt unterscheidet sich aber in einer Zeile die Schreibweise der Zeichen: ABCdef statt abcDEF. Verlassen Sie sich also nicht auf die Abfrage von Metadaten.

Übersicht

Die Diff-Tools eignen sich gleichermaßen für den Einsatz ...

Weiterlesen
epaper-Einzelheft 5,99€
NEWS Jetzt gratis testen
Bereits gekauft?Anmelden & Lesen
Leseprobe: Abdruck mit freundlicher Genehmigung von LinuxUser. Alle Rechte vorbehalten.
Lesen Sie jetzt diesen Artikel und viele weitere spannende Reportagen, Interviews, Hintergrundberichte, Kommentare und mehr aus über 1000 Magazinen und Zeitungen. Mit der Zeitschriften-Flatrate NEWS von United Kiosk können Sie nicht nur in den aktuellen Ausgaben, sondern auch in Sonderheften und im umfassenden Archiv der Titel stöbern und nach Ihren Themen und Interessensgebieten suchen. Neben der großen Auswahl und dem einfachen Zugriff auf das aktuelle Wissen der Welt profitieren Sie unter anderem von diesen fünf Vorteilen:

  • Schwerpunkt auf deutschsprachige Magazine
  • Papier sparen & Umwelt schonen
  • Nur bei uns: Leselisten (wie Playlists)
  • Zertifizierte Sicherheit
  • Freundlicher Service
Erfahren Sie hier mehr über United Kiosk NEWS.

Mehr aus dieser Ausgabe

Titelbild der Ausgabe 2/2020 von Hamara Linux: Nehmen und geben. Zeitschriften als Abo oder epaper bei United Kiosk online kaufen.
Hamara Linux: Nehmen und geben
Titelbild der Ausgabe 2/2020 von Lsdeluxe: Kunterbunt. Zeitschriften als Abo oder epaper bei United Kiosk online kaufen.
Lsdeluxe: Kunterbunt
Titelbild der Ausgabe 2/2020 von Drucken auf der Shell: Drucken per Skript. Zeitschriften als Abo oder epaper bei United Kiosk online kaufen.
Drucken auf der Shell: Drucken per Skript
Titelbild der Ausgabe 2/2020 von Navi: Interaktiver Spickzettel. Zeitschriften als Abo oder epaper bei United Kiosk online kaufen.
Navi: Interaktiver Spickzettel
Titelbild der Ausgabe 2/2020 von Ultrascreen: Hilfe per Fernblick. Zeitschriften als Abo oder epaper bei United Kiosk online kaufen.
Ultrascreen: Hilfe per Fernblick
Titelbild der Ausgabe 2/2020 von Ksnip: Bitte recht freundlich. Zeitschriften als Abo oder epaper bei United Kiosk online kaufen.
Ksnip: Bitte recht freundlich
Vorheriger Artikel
Navi: Interaktiver Spickzettel
aus dieser Ausgabe
Nächster Artikel Ultrascreen: Hilfe per Fernblick
aus dieser Ausgabe

... in Shell-Skripten und die Arbeit auf dem Desktop. Manche Programme vergleichen nur Textdateien, wobei die Möglichkeiten trotzdem vielfältig ausfallen: Von Quelltext über Markup- Dateien bis hin zu strukturierten Textdateien im CSV-Format eignen sich zahlreiche Varianten als Ausgangsmaterial. Andere Tools bearbeiten sogar Binärdateien. Die Tabelle Diff-Kommandos zeigt eine Auswahl der Befehle.

1 Der Vergleich zweier Textdateien mit Diff, wobei der Exit-Code bereits Auskunft über mögliche Unterschiede gibt.


Generalist

Als universelles Werkzeug zum Aufspüren von Unterschieden in Dateien eignet sich Diff besonders für den Einsatz in einem Shell-Skript. Dieses Programm findet sich praktisch auf allen Linux- und BSD-Systemen.

2 Beim Vergleich anderer Dateitypen und von Verzeichnissen leistet Diff ebenfalls gute Dienste.


Abbildung 1 zeigt den Einsatz von Diff in der Shell mitsamt Abfrage des Exit-Codes. Dabei steht der Rückgabewert 0 für zwei identische, 1 für unterschiedliche Dateien oder Verzeichnisse. Die Option -q unterdrückt umfangreiche Ausgaben. Abbildung 2 zeigt den Vergleich zweier PDF-Dateien sowie zweier Verzeichnisse.

Mit der Option -s weisen Sie Diff an, identische Dateien anzuzeigen. Das erleichtert das Aufspüren von Duplikaten. Listing 2 zeigt, wie Sie eine Tabelle erzeugen, die zu jedem Objekt gegebenenfalls auch das Duplikat aufzählt.

Abbildung 3 zeigt den Ablauf mit den Musterdaten. Die Liste fällt in anderen Fällen unter Umständen sehr umfangreich aus, da das Skript dann eventuell sogar Dateien in Unterverzeichnissen miteinander vergleicht.

Duplikate finden

Speziell zum Auflisten von doppelten Inhalten eignet sich Duff. Sie übergeben dem Kommando ein Suchmuster, damit die Suche gelingt, also mindestens ein Platzhaltersternchen (*). Von Haus aus unterbleibt der Vergleich von Unterverzeichnissen, außer Sie fordern das explizit mit der Option -r an. Beim Einsatz in einem Shell-Skript benötigen Sie nur die Angabe der Duplikate selbst, was Sie über den Schalter -e anfordern.

3 Das Skript aus Listing 2 untersucht eine Reihe von Dateien und zeigt an, ob sie sich unterscheiden oder identisch sind.


4 Mit Duff geht die Suche nach Duplikaten noch leichter, da die Software genau auf diesen Zweck zugeschnitten ist.


5 Wollen Sie Duplikate aus einem Verzeichnis entfernen, eignet sich dazu eine Kombination aus Duff mit etwas Shell-Logik.


Abbildung 4 (vorige Seite) stellt die Grundfunktionen von Duff anschaulich dar. Zuerst finden Sie die Grundform des Aufrufs: Dabei listet das Werkzeug die Anzahl der übereinstimmenden Dateien sowie jeweils Original- und Duplikat-Datei auf. Die Anzeige von Duplikaten bei den Textdateien im aktuellen Verzeichnis zeigt das zweite Beispiel, zum Schluss sehen Sie den Vergleich aller Dateien und Verzeichnisse mit der Auflistung der Duplikate.

Nachdem Duff speziell Duplikate aufspürt, liegt der Einsatz in einem Skript nahe. In Listing 3 finden Sie ein Skript, das gefundene Duplikate mit oder ohne Rückfrage entfernt. Die Rückfrage erhalten Sie durch die Option -i beim Befehl rm. Abbildung 5 zeigt, wie das in der Praxis aussieht.

Zeichenketten vergleichen

Das Shell-Builtin test leistet meist gute Dienste beim Vergleichen von Zeichenketten (Listing 4). Für einen schnellen Vergleich ist so ein Konstrukt jedoch umständlich. Mit Difference gelingt das Auswerten zweier Strings übersichtlicher. Abbildung 6 zeigt die Arbeitsweise des Tools.

Um dieses Programm in ein Skript einzubinden, bietet sich die Kombination mit dem Befehl wc zum Auswerten des Ergebnisses an. Listing 5 zeigt ein sehr reduziertes Beispiel; Abbildung 7 gibt einen Eindruck vom Ablauf des Skripts.

Mehr Komfort

Etwas mehr Komfort bietet das Programm Icdiff. Beim Vergleich zweier Textdateien hebt es Unterschiede farblich hervor, beim Vergleich zweier Ver- zeichnisse erhalten Sie eine Liste mit den Unterschieden. Wenn Sie die Ergebnisse von Icdiff in einem Shell-Skript auswerten möchten, benötigen Sie eine Kombination aus mehreren Tools, die Sie über eine Pipe verbinden. Abbildung 8 zeigt den Vergleich von Dateien und Verzeichnissen, jeweils abweichend und übereinstimmend.

6 Difference hilft dabei, Zeichenketten auf die Schnelle zu vergleichen.


Auf anderen Rechnern

Der Vergleich von Text- und Binärdateien, die sich auf verschiedenen Rechnern befinden oder verschiedenen Benutzern auf einem System gehören, erfordert ein etwas anderes Handwerkszeug: Ssh-diff versteht die von Diff bekannten Optionen mit Ausnahme von -r.

Für den Aufbau der Verbindung dürfen Sie außerdem einen abweichenden Port beim Zielsystem angeben, und bei Bedarf beschränken Sie die Kommunikation auf IPv4 oder IPv6. Das Kennwort geben Sie doppelt ein, es sei denn, Sie arbeiten mit einer Authentifizierung, die auf passwortlosen Schlüsseln basiert. Beim Vergleich von Binärdateien liefert Ssh-diff die Meldung, dass sich die Dateien unterscheiden. Abbildung 9 (nächste Seite) zeigt den Vergleich einer Textdatei. Im ersten Anlauf kommen in dem Beispiel zwei unterschiedliche, im zweiten zwei identische Dateien zum Einsatz.

PDF-Dateien

Für den Vergleich zweier PDF-Dateien per Shell eignet sich Comparepdf. Die Tabelle Comparepdf-Optionen (vorige Seite) zeigt die wenigen Optionen des Werkzeugs. Bei Gleichheit lautet der Exit-Code 0, andernfalls ist er größer null. Ein entsprechender Vergleich würde zwar auch mit Diff und Duff klappen, fiele aber deutlich komplexer aus.

7 Der Vergleich von zwei Zeichenketten ist eine Aufgabe, die Sie mit dem Tool Difference auf vergleichsweise einfache Weise erledigen.


8 Icdiff bringt beim Vergleich von Dateien und Verzeichnissen Farbe ins Spiel.


9 Beim Vergleich mit Ssh- diff brauchen die Dateien nicht auf demselben Rechner zu liegen. Das Tool setzt aber SSH als Grundlage voraus.


Tabelle Comparepdf-Optionen (vorige Seite) zeigt die wenigen Optionen des Werkzeugs. Bei Gleichheit lautet der Exit-Code 0, andernfalls ist er größer null. Ein entsprechender Vergleich würde zwar auch mit Diff und Duff klappen, fiele aber deutlich komplexer aus.

Abbildung 10 zeigt den Einsatz von Comparepdf in der Shell. Durch den eindeutigen Exit-Code benötigen Sie keine Werkzeuge, um in einem Shell-Skript das Ergebnis tiefer auszuwerten.

Möchten Sie die Unterschiede zwischen zwei PDF-Dateien am Bildschirm sehen, greifen Sie zu Diffpdf. Abbildung 11 zeigt einen Vergleich, bei dem Unterschiede zutage treten. Bei identischen PDF-Dateien erscheint anstelle des Texts nur in jedem Dateifenster der Hinweis, dass die Dateien identisch sind.

Bilder vergleichen

Bei Bildern helfen die bisher beschriebenen Werkzeuge nur bedingt weiter, da es sich um Binärdateien handelt. Benötigen Sie innerhalb eines Skripts einen entsprechenden Exit-Code, dann erweist sich das Prüfen gegen eine Checksumme als praktikabler.

Sind Hinweise auf die Änderungen selbst von Interesse, hilft Ihnen Diffimg weiter. Das Programm verarbeitet Bilddateien in den Formaten PNG, GIF und JPEG. Postscript-Dateien bearbeiten Sie unter Zuhilfenahme von Ghostscript. Es gibt keine Optionen, die Syntax fällt recht einfach aus (Listing 6).

Wenn Sie das Differenzbild öffnen, finden Sie die abweichenden Pixel angezeigt. So decken Sie etwas subtile Änderungen auf, wie etwa im Beispiel aus Abbildung w (Seite 38): Dort ist die Nummer der Lokomotive im RHB-Bahnhof Guarda (Graubünden) im mittleren Bild mit der Hintergrundfarbe des Zugs überpinselt. Das Ergebnis mit der Gegenüberstellung sehen Sie rechts. Stimmen beide Dateien überein, erhalten Sie eine vollständig schwarze Ausgabedatei, Änderungen finden Sie lagerichtig als weiße Pixel.

Steganografische Bilder, also solche, die eine versteckte Nachricht beinhalten, weisen als Differenz willkürliche, einzelne Pixel über die gesamte sonst schwarze Fläche des Differenzbilds auf. Das Verschlüsselungsrätsel selbst lösen Sie damit allerdings nicht. Daher ist es beim Gebrauch von Steganografie wichtig, die Originaldateien zum einen selbst zu erstellen und zum anderen nach dem Einsatz als Träger sicher zu löschen, um einen Vergleich auszuschließen.

Dateien zum Artikel herunterladen unter

www.linux-user.de/dl/43952

10 PDF-Dateien mit comparepdf vergleichen.


Differenzen einpflegen

Beim Übertragen von Dateien brauchen Sie nicht zwingend deren gesamten Inhalt zu übermitteln, wenn frühere Versionen am Ziel bereits vorliegen. Egal, ob Manuskript oder Quelltext: Es genügt, die Differenz zu finden und dann lediglich diese zu transferieren.

Mit vielen Programmen, meist aber mit Diff, erstellen Sie eine Datei mit den Patch-Anweisungen, um Änderungen einzuspielen. Mit der Anweisung aus der ersten Zeile von Listing 7 (nächste Seite) erstellen Sie eine Patch-Datei, deren Inhalt für unser Beispiel Listing 8 (nächste Seite) zeigt.

Damit sind die Dateinamen und die enthaltenen Änderungen bekannt. Sie spielen die Daten mit dem Kommando aus der zweiten Zeile von Listing 7 ein.

11 Diffpdf stellt unterschiedliche PDF-Dateien dar.


Mit der Option -b sichern Sie dabei die Originaldatei vor dem Patch. Abbildung 13 zeigt das Anfertigen der Patch- Datei. Abbildung 14 zeigt das Einspielen des Patches und das Ergebnis. Dabei fragt die Software ab, ob Sie die neuere Datei bearbeiten möchten.

Auch das Patchen von Verzeichnissen gelingt bei Bedarf. Dazu erstellen Sie mittels Diff eine Datei mit den Unterschieden, die Sie mit Patch wieder einspielen.

Fazit

Auf der Kommandozeile lassen sich Unterschiede zwischen Dateien und Verzeichnissen schnell ermitteln; ebenso erkennen Sie auf einfache Weise Duplikate. Statt komplette Textdateien weiterzugeben, sparen Sie bei umfangreichen Änderungen Bandbreite und Plattenplatz, indem Sie lediglich einen Patch erstellen und weiterreichen. (agr)

12 Links sehen Sie das Original, in der Mitte das bearbeitete Bild, und rechts die Ausgabe der Differenzen der beiden Bilder. Dabei zeigen die hellen Pixel die Lage der Änderungen an.


13 Gerade bei Quellcode ist es sinnvoll, lediglich die Differenzen zu einer früheren Datei als sogenannten Patch bereitzustellen.


14 Das Einspielen eines mit Diff erstellten Patches gelingt am Zielort im Handumdrehen.

README

So manche Situation erfordert das Aufspüren von gleichen oder unterschiedlichen Objekten im Verzeichnisbaum. Jedes Linux- System liefert eine Reihe von Werkzeugen, die Ihnen bei solchen Vergleichen hilft. Einige der Tools integrieren sich dabei ausgezeichnet in ein Shell-Skript.

Beispieldaten

Als Datenbasis für die Beispiele in diesem Beitrag dienen als Textdateien die Files 1.txt, 2.txt und 3.txt, wobei 1.txt und 3.txt identisch sind. Außerdem kommen die PDF-Dateien 1.pdf, 2.pdf und 3.pdf zum Einsatz, wobei wiederum 1.pdf und 3.pdf identisch sind. Die Dateien befinden sind in den Verzeichnissen erstes, zweites und drittes, wobei der Inhalt von erstes und drittes gleich ist.