Probabilmente dovresti dare un'occhiata agli strumenti relativi a rsync:rdiff e rdiff-backup .Il rdiff
Il comando ti consente di produrre un file patch e applicarlo a qualche altro file.
Il rdiff-backup
Il comando utilizza questo approccio per gestire intere directory, ma immagino che tu stia lavorando con immagini disco a file singolo, quindi rdiff
sarà quello da usare.
xdelta può fare tutto quello che vuoi. Giusto avvertimento, però, se le tue immagini non sono molto simile, puoi finire con una patch molto grande, perché xdelta utilizza metà del buffer di memoria definito per trovare le differenze. Maggiori informazioni sono disponibili alla pagina wiki TuningMemoryBudget. Aumentare la dimensione del buffer può essere di grande aiuto.
bsdiff è un'altra opzione, ma è molto Affamato di RAM e completamente inappropriato per qualcosa delle dimensioni di un'immagine disco.
bsdiff è piuttosto affamato di memoria. Richiede
max(17*n,9*n+m)+O(1)
byte di memoria, doven
è la dimensione del vecchio file em
è la dimensione del nuovo file. bspatch richieden+m+O(1)
byte.
Risposta canonica
Per quanto riguarda rdiff il post, librsync 2.0.1 è una buona lettura per il chiarimento della funzionalità del comando, quindi ho fatto riferimento a quello di seguito per preservare il contenuto di questa risposta se non altro.
È importante cercare di comprendere bene i tre passaggi di rdiff per l'aggiornamento di un file:firma , delta e patch come detto nella pagina man di rdiff. Ho anche trovato un rdiff
script di esempio di comando su GitHub che è utile a cui farò riferimento e citerò.
Essenzialmente...
- Con un file "iniziale" o base [
file1
] e crei un file di firma da esso
- Di solito è molto più piccolo del file base/originale stesso
- Con il file della firma lo confronti con un altro file [
file2
] simile al file di base ma diverso (ad es. aggiornato di recente ) e crea un file delta contenente solo le differenze tra i due file- Utilizza "solo differenze" o file delta e confrontalo con il tuo file di base [
file1
] per generare un nuovo file contenente le modifiche dall'altro file [file2
] corrispondenti ai due.
Comandi rapidi (per 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
Introduzione
rdiff è un programma per calcolare e applicare i delta di rete. Un delta rdiff è un delta tra file binari, che descrive come un file base (o vecchio) può essere modificato automaticamente per produrre un file risultato (o nuovo).
A differenza della maggior parte dei programmi diff, librsync non richiede l'accesso a entrambi i file quando viene calcolato il diff. Il calcolo di un delta richiede solo una breve "firma" del vecchio file e il contenuto completo del nuovo file. La firma contiene i checksum per i blocchi del vecchio file. Usando questi checksum, rdiff trova i blocchi corrispondenti nel nuovo file, quindi calcola il delta.
I delta rdiff sono solitamente meno compatti e anche più lenti a produrre thanxdelta o normali differenze di testo. Se è possibile avere sia il file vecchio che quello nuovo quando si calcola il delta, xdelta generalmente produrrà un file molto più piccolo. Se i file confrontati sono in chiaro, allora GNU diff è di solito una scelta migliore, in quanto le differenze possono essere visualizzate dagli umani e applicate come corrispondenze inesatte.
rdiff si rivela utile quando non è conveniente avere entrambi i file presenti contemporaneamente. Un esempio di ciò è che i due file si trovano su macchine separate e si desidera trasferire solo le differenze. Un altro esempio è quando uno dei file è stato spostato su un supporto di archiviazione o di backup, lasciando solo la sua firma.
Simbolicamente
signature(basis-file) -> sig-file delta(sig-file, new-file) -> delta-file patch(basis-file, delta-file) -> recreated-file
Utilizza schemi
Una tipica applicazione dell'algoritmo rsync consiste nel trasferire un file A2 da una macchina A a una macchina B che ha un file simile A1. Questo può essere fatto come segue:
- B genera la firma rdiff di A1. Chiamalo S1. B invia la firma ad A. (La firma è solitamente molto più piccola del fileit descritto.)
- A calcola il delta rdiff tra S1 e A2. Chiama questo delta D. A invia il delta a B.
- B applica il delta per ricreare A2. Nei casi in cui A1 e A2 contengono sequenze di byte identici, rdiff dovrebbe fornire un notevole risparmio di spazio.
fonte