GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Binärer Diff/Patch für große Dateien unter Linux?

Sie sollten sich wahrscheinlich die rsync-bezogenen Tools ansehen:rdiff und rdiff-backup .Der rdiff Mit dem Befehl können Sie eine Patch-Datei erstellen und auf eine andere Datei anwenden.

Die rdiff-backup Der Befehl verwendet diesen Ansatz, um mit ganzen Verzeichnissen umzugehen, aber ich vermute, Sie arbeiten mit Einzeldatei-Disk-Images, also rdiff wird derjenige sein, der verwendet wird.


xdelta kann alles, was Sie wollen. Faire Warnung, wenn Ihre Bilder nicht sehr sind In ähnlicher Weise können Sie mit einem sehr großen Patch enden, da xdelta die Hälfte des definierten Speicherpuffers zum Auffinden von Unterschieden verwendet. Weitere Informationen finden Sie auf der Wiki-Seite von TuningMemoryBudget. Das Erhöhen der Puffergröße kann ziemlich hilfreich sein.

bsdiff ist eine weitere Option, aber sehr RAM-hungrig und völlig ungeeignet für irgendetwas von der Größe eines Disk-Images.

bsdiff ist ziemlich speicherhungrig. Es erfordert max(17*n,9*n+m)+O(1) Byte Speicher, wobei n ist die Größe der alten Datei und m ist die Größe der neuen Datei. spatch erfordert n+m+O(1) Byte.


Kanonische Antwort

In Bezug auf rdiff the post ist librsync 2.0.1 eine gute Lektüre für die Erläuterung der Befehlsfunktionalität, daher habe ich unten darauf verwiesen, um den Inhalt dieser Antwort beizubehalten, wenn nichts anderes.

Es ist wichtig zu versuchen, ein gutes Verständnis für die drei Schritte zum Aktualisieren einer Datei zu bekommen:Signatur , Delta , und Patch wie auf der Manpage von rdiff beschrieben. Ich habe auch eine rdiff gefunden Befehlsbeispielskript auf GitHub, das hilfreich ist, auf das ich verweisen und zitieren werde.

Im Wesentlichen...

  1. Mit einer "Start"- oder Basisdatei [file1 ] und Sie erstellen eine Signaturdatei daraus
    • Diese ist normalerweise viel kleiner als die Basis-/Originaldatei selbst
  2. Mit der Signaturdatei Sie vergleichen es mit einer anderen Datei [file2 ] Ihrer Basisdatei ähnlich, aber anders (z. B. kürzlich aktualisiert ) und erstellen Sie eine Delta-Datei enthält nur die Unterschiede zwischen den beiden Dateien
  3. Verwenden Sie die "Nur Unterschiede" oder Delta-Datei und vergleichen Sie sie mit Ihrer Basisdatei [file1 ], um eine neue Datei zu generieren, die die Änderungen aus der anderen Datei enthält [file2 ] passend zu den beiden.

Schnellbefehle (gemäß rdiff-example.sh )

rdiff signature file1 signature-file            ## signature base file1
rdiff delta signature-file file2 delta-file     ## delta differences file2
rdiff patch file1 delta-file gen-file           ## compare delta to file1 to create matching file2

rdiff-example.sh

# $ rdiff --help
# Usage: rdiff [OPTIONS] signature [BASIS [SIGNATURE]]
#              [OPTIONS] delta SIGNATURE [NEWFILE [DELTA]]
#              [OPTIONS] patch BASIS [DELTA [NEWFILE]]

# Options:
#   -v, --verbose             Trace internal processing
#   -V, --version             Show program version
#   -?, --help                Show this help message
#   -s, --statistics          Show performance statistics
# Delta-encoding options:
#   -b, --block-size=BYTES    Signature block size
#   -S, --sum-size=BYTES      Set signature strength
#       --paranoia            Verify all rolling checksums
# IO options:
#   -I, --input-size=BYTES    Input buffer size
#   -O, --output-size=BYTES   Output buffer size

# create signature for old file
rdiff signature old-file signature-file
# create delta using signature file and new file
rdiff delta signature-file new-file delta-file
# generate new file using old file and delta
rdiff patch old-file delta-file gen-file
# test
diff -s gen-file new-file
# Files gen-file and new-file are identical

Einführung

rdiff ist ein Programm zur Berechnung und Anwendung von Netzwerkdeltas. Ein rdiff-Delta ist ein Delta zwischen Binärdateien, das beschreibt, wie eine Basisdatei (oder alte Datei) automatisch bearbeitet werden kann, um eine Ergebnisdatei (oder neue Datei) zu erzeugen.

Im Gegensatz zu den meisten Diff-Programmen benötigt librsync keinen Zugriff auf beide Dateien, wenn der Diff berechnet wird. Die Berechnung eines Deltas erfordert nur eine kurze "Signatur" der alten Datei und den vollständigen Inhalt der neuen Datei. Die Signatur enthält Prüfsummen für Blöcke der alten Datei. Anhand dieser Prüfsummen findet rdiff übereinstimmende Blöcke in der neuen Datei und berechnet dann das Delta.

rdiff-Deltas sind normalerweise weniger kompakt und erzeugen auch langsamer als xdeltas oder normale Text-Diffs. Wenn es möglich ist, bei der Berechnung des Deltas sowohl die alte als auch die neue Datei zu haben, erzeugt xdelta im Allgemeinen eine viel kleinere Datei. Wenn es sich bei den verglichenen Dateien um Klartext handelt, ist GNU Diff normalerweise die bessere Wahl, da die Diffs von Menschen eingesehen und als ungenaue Übereinstimmungen angewendet werden können.

rdiff kommt zum Tragen, wenn es nicht bequem ist, beide Dateien gleichzeitig zu haben. Ein Beispiel hierfür ist, dass sich die beiden Dateien auf verschiedenen Computern befinden und Sie nur die Unterschiede übertragen möchten. Ein weiteres Beispiel ist, wenn eine der Dateien auf ein Archiv- oder Backup-Medium verschoben wurde und nur ihre Signatur zurückbleibt.

Symbolisch

signature(basis-file) -> sig-file

delta(sig-file, new-file) -> delta-file

patch(basis-file, delta-file) -> recreated-file

Muster verwenden

Eine typische Anwendung des rsync-Algorithmus besteht darin, eine Datei A2 von einer Maschine A zu einer Maschine B zu übertragen, die eine ähnliche Datei A1 hat. Dies kann wie folgt erfolgen:

  1. B generiert die rdiff-Signatur von A1. Nennen Sie dies S1. B sendet die Signatur an A. (Die Signatur ist normalerweise viel kleiner als die Datei, die sie beschreibt.)
  2. A berechnet das rdiff-Delta zwischen S1 und A2. Nennen Sie dieses Delta D. A sendet das Delta an B.
  3. B wendet das Delta an, um A2 neu zu erstellen. In Fällen, in denen A1 und A2 Folgen identischer Bytes enthalten, sollte rdiff eine erhebliche Platzersparnis bringen.

Quelle


Linux
  1. KRename – Ein leistungsstarker Batch-Dateiumbenenner für Linux

  2. 7 Patch-Befehlsbeispiele zum Anwenden von Diff-Patch-Dateien unter Linux

  3. Wie kann man unter Linux Binärdateien von Textdateien unterscheiden?

  4. Benötigen Sie einen guten Hex-Editor für Linux

  5. Was ist eine gute Lösung für das Tagging von Dateien unter Linux?

Arbeiten Sie mit Linux-Diff und -Patch an einer Datei zusammen

Kopieren von Dateien unter Linux

Finden Sie große Dateien in Linux

Cp-Befehl in Linux (Dateien kopieren)

So teilen Sie große Audiodateien unter Linux

ls-Befehl in Linux zum Auflisten von Dateien