GNU/Linux >> Linux Esercitazione >  >> Linux

Diff binario/patch per file di grandi dimensioni su Linux?

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, dove n è la dimensione del vecchio file e m è la dimensione del nuovo file. bspatch richiede n+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...

  1. 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
  2. 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
  3. 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:

  1. B genera la firma rdiff di A1. Chiamalo S1. B invia la firma ad A. (La firma è solitamente molto più piccola del fileit descritto.)
  2. A calcola il delta rdiff tra S1 e A2. Chiama questo delta D. A invia il delta a B.
  3. 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


Linux
  1. Spostare file su Linux senza mv

  2. 7 Esempi di comandi di patch per applicare i file di patch Diff in Linux

  3. Linux:rimuovi le estensioni di file per più file

  4. Hai bisogno di un buon editor esadecimale per Linux

  5. Qual è una buona soluzione per la codifica dei file in Linux?

Collabora su un file usando Linux diff e patch

Copiare file in Linux

Trova file di grandi dimensioni in Linux

Comando Cp in Linux (copia file)

Come dividere file audio di grandi dimensioni su Linux

Comando ls in Linux per elencare i file