Come faccio a fare una diff binaria su due file di dimensioni identiche sotto Linux?


37

Ho due file di dimensioni identiche e devo fare un diff binario per verificare se sono uguali.

Attualmente sto correndo, diff file1.img file2.imgma ci vuole un po 'di tempo per elaborare i miei file da 4 GB. È questo il modo più efficace per farlo?

Risposte:


45

cmpè progettato per trovare differenze nei file binari. Puoi anche provare a checksumming ( sum) e confrontare gli hash.


21

Uno dei modi più comuni per determinare se due file sono identici (supponendo che le dimensioni corrispondano) è utilizzare un programma per creare un " hash " (essenzialmente un'impronta digitale) di un file. I più comuni sono md5sume sha1sum.

Per esempio:

$ md5sum file1 file2
e0e7485b678a538c2815132de7f9e878  file1
4a14aace18d472709ccae3910af55955  file2

Se hai molti file che devi controllare, ad esempio se stai trasferendo una directory piena di file da un sistema all'altro, puoi reindirizzare l'output dal sistema originale a un file, quindi md5sum/ sha1sumpuoi usare automaticamente quel file per dire quali file sono diversi:

$ md5sum file1 file2 > MD5SUMS
... copy file1, file2, MD5SUMS across
$ md5sum --check MD5SUMS
file1: OK
file2: OK

2
MD5 non è sempre affidabile per questo: digg.com/security/…
Jon Cage

28
In realtà, MD5 è affidabile per i controlli di integrità di base. Semplicemente non è considerato crittograficamente forte come una volta pensavamo. Se sei preoccupato per gli hacker, non usare MD5, ma se vuoi solo sapere se alcuni file copiati da un CD sono stati danneggiati o se il tuo compilatore sputa file identici ogni volta, MD5 è più che adeguato.
Adam Batkin,


3

Se voglio solo sapere se sono uguali, preferisco usare sha1sum se è disponibile o md5 come fallback.

Se voglio sapere quanto sono diversi o dove sono diversi, una cosa che funziona è farli girare entrambi attraverso od ('dump ottale', che di solito ha un'opzione esadecimale) per creare file temporanei e poi diff.


2
Se vuoi sapere se sono due file uguali, non penso che usare sha1sum (o md5sum per quella materia) possa essere più efficiente del semplice diff (dato che questa era la domanda originale), perché anche se i due ( di grandi dimensioni) i file differiscono all'inizio), li leggerete interamente prima di sapere che differiscono.
Pierre,

@Pierre BUT, hashing e cripto-firma funziona su dispositivi remoti.
VasyaNovikov,

1

Ho appena eseguito alcuni benchmark su un file di oltre 100 MB. diff è stato il più veloce, mentre cmp è arrivato secondo e l'utilizzo di md5sum è arrivato per ultimo.

# time diff file1 file2; echo $?

real    0m0.122s
user    0m0.009s
sys 0m0.113s
0
# time cmp file1 file2; echo $?

real    0m0.213s
user    0m0.097s
sys     0m0.117s
0
# time md5sum file1 > /tmp/test; time md5sum file2 > /tmp/test2; diff /tmp/test /tmp/test2; echo $?

real    0m0.279s
user    0m0.211s
sys     0m0.066s

real    0m0.316s
user    0m0.225s
sys     0m0.073s
0

Ho ripreso l'esercizio con un file da 4,3 GB e ho dovuto eliminare e ricreare il file con dd poiché la cache RAM influiva notevolmente sui risultati.

$time diff file1 file2; echo $?

real    0m19.325s
user    0m0.995s
sys 0m5.280s
0

$time cmp file1 file2; echo $?

real    0m36.106s
user    0m4.399s
sys 0m6.147s
0

$time md5sum file1 > /tmp/test; time md5sum file2 > /tmp/test2; diff /tmp/test /tmp/test2; echo $?

real    0m10.441s
user    0m8.054s
sys 0m2.357s

real    0m24.682s
user    0m8.027s
sys 0m3.442s
0

Sulla base di questi risultati, consiglierei di spostare i file su un supporto RAMFS e di attenersi a diff.


Mi piace che tu abbia effettivamente fatto un benchmark, ma 100 Mb non è rappresentativo del caso del PO. 1.000 Mb sarebbe molto meglio.
jpaugh,

1
concordato che è il motivo per cui ho eseguito i 4.3 test del concerto alcuni mesi dopo. In realtà è stato necessario sfuggire alla memorizzazione nella cache del sistema operativo.
forbidder

Immagino che lo faccia. Mi scuso per non aver letto nel mezzo della tua risposta. (Ho ancora pensato che fosse abbastanza buono per votare, anche solo vedendo il primo benchmark.) FWIW, c'è un po 'di magia del kernel per disabilitare la memorizzazione dei file nella cache. Dovrei fare il benchmark da solo per vedere quali funzionano effettivamente o sono necessari.
jpaugh,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.