Come confrontare i file binari per verificare se sono uguali?


186

Qual è il modo più semplice (utilizzando uno strumento grafico o una riga di comando su Ubuntu Linux) per sapere se due file binari sono uguali o meno (tranne i timestamp)? Non ho bisogno di estrarre effettivamente la differenza. Devo solo sapere se sono uguali o no.


5
Una domanda che chiede di mostrare come differiscono: superuser.com/questions/125376/…
Ciro Santilli 4 冠状 病 六四 事件 法轮功

2
La pagina man cmpspecifica che fa un confronto byte per byte, quindi questo è il mio default per 2 file binari. diffè riga per riga e ti darà la stessa risposta Sì / No ma ovviamente non lo stesso dump al flusso di uscita standard. Se le linee sono lunghe perché forse non sono file di testo, preferirei cmp. diffha il vantaggio di poter specificare un confronto tra directory e -rfor for recursion confrontando così più file in un solo comando.
H2ONaCl

Risposte:


180

L'unix standard diffmostrerà se i file sono uguali o meno:

[me@host ~]$ diff 1.bin 2.bin
Binary files 1.bin and 2.bin differ

Se non c'è output dal comando, significa che i file non hanno differenze.


5
diff sembra avere problemi con file molto grandi . Ho ottenuto un diff: memory exhaustedconfronto tra due file 13G.
Yongwei Wu,

1
Uscita interessante. diffti sta dicendo che sono dei "binari". Poiché tutti i file possono essere considerati binari, questa è una strana affermazione.
H2ONaCl

7
Puoi segnalare file identici con l'opzione: diff -s 1.bin 2.binoppure diff --report-identical-files 1.bin 2.binQuesto mostraFiles 1.bin and 2.bin are identical
Tom Kuschel il

1
No, dirà che sono "diversi", quindi non sono gli stessi
Josef Klimuk

1
Ho due eseguibili, so che sono diversi perché li ho compilati ed eseguiti, ma tutte le opzioni di diff e cmp qui indicate li giudicano identici. Perché? !!!
mirkastath,

107

Usa il cmpcomando. Questo uscirà in modo pulito se sono binari uguali, oppure stamperà dove si verifica la prima differenza ed esce.


9
Per il caso d'uso l'OP descrive che IMHO cmpè più efficiente di diff. Quindi preferirei questo.
Halloleo,

5
Ho uno script di shell che esegue:cmp $1 $2 && echo "identical" || echo "different"
steveha,

2
il cmp si interrompe quando trova la prima differenza e lo visualizza o passa alla fine dei file?
sop

cmpha modalità "silenziosa": -s, --quiet, --silent- suppress all normal output. Non ho ancora provato ma penso che si fermerà alla prima differenza se ce n'è uno.
Victor Yarema,

90

Ho scoperto che Visual Binary Diff era quello che cercavo, disponibile su:

  • Ubuntu:

    sudo apt install vbindiff
    
  • Arch Linux:

    sudo pacman -S vbindiff
    
  • Mac OS X tramite MacPorts :

    port install vbindiff
    
  • Mac OS X tramite Homebrew:

    brew install vbindiff
    

1
Bello ... io / ho pensato / volevo solo sapere se i file differivano; ma essere in grado di vedere facilmente le differenze esatte è stato molto più utile. Tende a segfault quando arriva alla fine del file, ma non importa, ha ancora funzionato.
Jeremy,

2
È stato detto alcune volte, ma questo è un piccolo programma fantastico! (fyi anche in homebrew)
johncip,

2
Questa dovrebbe essere la risposta accettata in quanto è un metodo di gran lunga superiore rispetto all'output insipido e inutile del comando diff canonico.
Gearoid Murphy

1
Questo è lo strumento migliore per diff binario.
Carla Camargo,

17

Usa sha1 per generare checksum:

sha1 [FILENAME1]
sha1 [FILENAME2]

3
Se hai avuto solo un checksum per uno dei file, questo sarebbe utile, ma se hai entrambi i file sul disco questo non è necessario. diffe cmpti diranno entrambi se differiscono senza alcuno sforzo aggiuntivo.
johncip,

1
Non è sha1suminvece di sha1?
kol

2
sha1 su NetBSD, sha1sum su Linux
Scott Presnell,

2
Esistono due file che restituiranno lo stesso risultato nonostante siano diversi: shattered.io
mik

2
SHA1 ha già una collisione pubblica ( shattered.io ) e probabilmente anche alcuni non pubblici. Una collisione può essere utilizzata per generare innumerevoli file in collisione Usa invece SHA2 per l'hash, per favore.
Michal Ambroz,

12

Ho finito per usare hexdump per convertire i file binari nella loro rappresentazione esadecimale e poi li ho aperti in meld / kompare / qualsiasi altro strumento diff. A differenza di te, cercavo le differenze nei file.

hexdump tmp/Circle_24.png > tmp/hex1.txt
hexdump /tmp/Circle_24.png > tmp/hex2.txt

meld tmp/hex1.txt tmp/hex2.txt

1
Utilizzare hexdump -v -e '/1 "%02x\n"'se si desidera diff e vedere esattamente quali byte sono stati inseriti o rimossi.
William Entriken,

La combinazione funziona anche con file binari quando non vengono convertiti prima in esadecimali. Mostra valori esadecimali per cose che non sono nel set di caratteri, altrimenti caratteri normali, che è utile con file binari che contengono anche del testo ASCII. Molti lo fanno, almeno iniziano con una corda magica.
Felix Dombek,

7

Puoi usare la funzione hash MD5 per verificare se due file sono uguali, con questo non puoi vedere le differenze a un livello basso, ma è un modo rapido per confrontare due file.

md5 <filename1>
md5 <filename2>

Se entrambi gli hash MD5 (l'output del comando) sono uguali, i due file non sono diversi.


7
Puoi spiegare i tuoi voti negativi per favore? SHA1 ha 4 voti positivi e, se l'OP ritiene che ci sia una possibilità che i due file possano essere uguali o simili, le possibilità di una collisione sono lievi e non meritevoli di un voto negativo su MD5 ma di un voto positivo su SHA1 diverso dal fatto che hai sentito che dovresti avere il tuo hash password con SHA1 anziché MD5 (questo è un problema diverso).
Rikki,

2
non sono sicuro del motivo, ma un cmp puro sarà più efficiente rispetto al calcolo di qualsiasi funzione hash dei file e al loro confronto (almeno per solo 2 file)
Paweł Szczur

1
se i due file sono di grandi dimensioni e sullo stesso disco (non ssd), la variante md5 o sha * potrebbe essere più veloce perché i dischi possono leggere i due file in sequenza, risparmiando molti movimenti della testa
Daniel Alder,

7
Ho effettuato il downgrade perché hai pubblicato una variante minore di una soluzione precedente (non valida), quando avrebbe dovuto essere un commento.
johncip

6

Usa il comando cmp. Fare riferimento a File binari e forzare confronti di testo per ulteriori informazioni.

cmp -b file1 file2

1
-bnon confronta i file in "modalità binaria". In realtà "Con GNU cmp, puoi anche usare l' opzione -bo --print-bytesper mostrare la rappresentazione ASCII di quei byte". Questo è esattamente quello che ho trovato usando l'URL per il manuale che hai fornito.
Victor Yarema,

Victor Yarema, non so cosa intendi per "modalità binaria". cmpè intrinsecamente un confronto binario secondo me. L' -bopzione stampa semplicemente il primo byte che è diverso.
H2ONaCl

4

Per trovare difetti nella memoria flash, ho dovuto scrivere questo script che mostra tutti i blocchi da 1K che contengono differenze (non solo il primo come cmp -bfa)

#!/bin/sh

f1=testinput.dat
f2=testoutput.dat

size=$(stat -c%s $f1)
i=0
while [ $i -lt $size ]; do
  if ! r="`cmp -n 1024 -i $i -b $f1 $f2`"; then
    printf "%8x: %s\n" $i "$r"
  fi
  i=$(expr $i + 1024)
done

Produzione:

   2d400: testinput.dat testoutput.dat differ: byte 3, line 1 is 200 M-^@ 240 M- 
   2dc00: testinput.dat testoutput.dat differ: byte 8, line 1 is 327 M-W 127 W
   4d000: testinput.dat testoutput.dat differ: byte 37, line 1 is 270 M-8 260 M-0
   4d400: testinput.dat testoutput.dat differ: byte 19, line 1 is  46 &  44 $

Disclaimer: ho hackerato la sceneggiatura in 5 minuti. Non supporta gli argomenti della riga di comando né supporta gli spazi nei nomi dei file


Ottengo "r: not found" (usando GNU linux)
unseen_rider

@unseen_rider quale shell, quale linea? Si prega di chiamare lo script utilizzando sh -xper il debug
Daniel Alder

Questo avviene chiamando lo script dal terminale. La linea è 9.
unseen_rider

@unseen_rider Non posso aiutarti in questo modo. Lo script è ok. Pubblica il tuo output di debug su pastebin.com . Puoi vedere qui cosa intendo: pastebin.com/8trgyF4A . Inoltre, per favore dimmi l'output direadlink -f $(which sh)
Daniel Alder,

L'ultimo comando dà /bin/dash. Attualmente creando incolla su pastebin.
unseen_rider,

4

Diff con le seguenti opzioni farebbe un confronto binario per verificare se i file sono completamente diversi e produrrebbe se i file fossero uguali:

diff -qs {file1} {file2}

Se stai confrontando due file con lo stesso nome in directory diverse, puoi invece utilizzare questo modulo:

diff -qs {file1} --to-file={dir2}

OS X El Capitan


3

Prova diff -s

Risposta breve: corri diffcon l' -sinterruttore.

Risposta lunga: continua a leggere qui sotto.


Ecco un esempio Iniziamo creando due file con contenuti binari casuali:

$ dd if=/dev/random bs=1k count=1 of=test1.bin
1+0 records in
1+0 records out
1024 bytes (1,0 kB, 1,0 KiB) copied, 0,0100332 s, 102 kB/s

                                                                                  
$ dd if=/dev/random bs=1k count=1 of=test2.bin
1+0 records in
1+0 records out
1024 bytes (1,0 kB, 1,0 KiB) copied, 0,0102889 s, 99,5 kB/s

Ora facciamo una copia del primo file:

$ cp test1.bin copyoftest1.bin

Ora test1.bin e test2.bin dovrebbero essere diversi:

$ diff test1.bin test2.bin
Binary files test1.bin and test2.bin differ

... e test1.bin e copyoftest1.bin dovrebbero essere identici:

$ diff test1.bin copyoftest1.bin

Ma aspetta! Perché non c'è uscita?!?

La risposta è: questo è di progettazione. Non c'è output su file identici.

Ma ci sono diversi codici di errore:

$ diff test1.bin test2.bin
Binary files test1.bin and test2.bin differ

$ echo $?
1


$ diff test1.bin copyoftest1.bin

$ echo $?
0

Ora per fortuna non devi controllare i codici di errore ogni volta perché puoi semplicemente usare l'opzione -s(o --report-identical-files) per rendere diff più dettagliato:

$ diff -s test1.bin copyoftest1.bin
Files test1.bin and copyoftest1.bin are identical

2

Radiff2 è uno strumento progettato per confrontare i file binari, in modo simile al modo in cui il diff normale confronta i file di testo.

Prova radiff2a fare parte del radare2disassemblatore. Ad esempio, con questo comando:

radiff2 -x file1.bin file2.bin

Ottieni un output a due colonne piuttosto formattato in cui le differenze sono evidenziate.


1

I miei preferiti usando xxd hex-dumper dal pacchetto vim:

1) utilizzo di vimdiff (parte di vim)

#!/bin/bash
FILE1="$1"
FILE2="$2"
vimdiff <( xxd "$FILE1" ) <( xxd "$FILE2" )

2) usando diff

#!/bin/bash
FILE1=$1
FILE2=$2
diff -W 140 -y <( xxd $FILE1 ) <( xxd $FILE2 ) | colordiff | less -R -p '  \|  '

0
md5sum binary1 binary2

Se md5sum è uguale, i binari sono uguali

Per esempio

md5sum new*
89c60189c3fa7ab5c96ae121ec43bd4a  new.txt
89c60189c3fa7ab5c96ae121ec43bd4a  new1.txt
root@TinyDistro:~# cat new*
aa55 aa55 0000 8010 7738
aa55 aa55 0000 8010 7738


root@TinyDistro:~# cat new*
aa55 aa55 000 8010 7738
aa55 aa55 0000 8010 7738
root@TinyDistro:~# md5sum new*
4a7f86919d4ac00c6206e11fca462c6f  new.txt
89c60189c3fa7ab5c96ae121ec43bd4a  new1.txt

1
Non proprio. Solo la possibilità è alta.
Sawa,

Qual è la probabilità di fallimento?
ashish

Sottile, ma peggio che usare una variante di diff, su cui non c'è motivo di preferirlo.
Sawa,

Dovresti cambiare l'hash MD5 in SHA2 per rendere pratico questo consiglio. Oggigiorno il laptop di chiunque può generare collisioni in MD5 e basato su questo singolo prefisso di collisione (2 file della stessa dimensione, stesso prefisso e stesso MD5) per generare un numero infinito di file in collisione (con lo stesso prefisso, blocco di collisione diverso, stesso suffisso)
Michal Ambroz,

-1

Esiste un modo relativamente semplice per verificare se due file binari sono uguali.

Se si utilizza l'input / output del file in un linguaggio di programmazione; è possibile memorizzare ogni bit di entrambi i file binari nei propri array.

A questo punto il controllo è semplice come:

if(file1 != file2){
    //do this
}else{
    /do that
}
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.