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...
- Mit einer "Start"- oder Basisdatei [
file1
] und Sie erstellen eine Signaturdatei daraus- Diese ist normalerweise viel kleiner als die Basis-/Originaldatei selbst
- 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 - 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:
- 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.)
- A berechnet das rdiff-Delta zwischen S1 und A2. Nennen Sie dieses Delta D. A sendet das Delta an B.
- 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