¿Cómo comparar archivos binarios para verificar si son iguales?

186

¿Cuál es la forma más fácil (usando una herramienta gráfica o línea de comando en Ubuntu Linux) para saber si dos archivos binarios son iguales o no (excepto las marcas de tiempo)? No necesito realmente extraer la diferencia. Solo necesito saber si son iguales o no.

sawa
fuente
55
Una pregunta que pide para mostrar cómo se diferencian: superuser.com/questions/125376/...
Ciro Santilli郝海东冠状病六四事件法轮功
2
La página de manual cmpdice específicamente que hace una comparación byte por byte, por lo que ese es mi valor predeterminado para 2 archivos binarios. diffes línea por línea y le dará la misma respuesta Sí / No pero, por supuesto, no el mismo volcado a la secuencia de salida estándar. Si las líneas son largas porque quizás no son archivos de texto, entonces preferiría cmp. difftiene la ventaja de que puede especificar una comparación de directorios y la -rrecursividad, comparando así múltiples archivos en un solo comando.
H2ONaCl

Respuestas:

180

El Unix estándar diffmostrará si los archivos son iguales o no:

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

Si no hay salida del comando, significa que los archivos no tienen diferencias.

Joe
fuente
55
diff parece tener problemas con archivos realmente grandes . Obtuve un diff: memory exhaustedal comparar dos archivos 13G.
Yongwei Wu
1
Interesante salida. diffte dice que son moscas "binarias". Dado que todos los archivos pueden considerarse binarios, es una afirmación extraña.
H2ONaCl
77
Puede informar archivos idénticos con la opción: diff -s 1.bin 2.bino diff --report-identical-files 1.bin 2.binEsto muestraFiles 1.bin and 2.bin are identical
Tom Kuschel
1
No, dirá que son "diferentes", por lo que no son lo mismo
Josef Klimuk
1
Tengo dos ejecutables, sé que son diferentes porque los compilé y los ejecuté, pero todas las opciones de diff y cmp dadas aquí los juzgan idénticos. ¿Por qué? !!!
mirkastath
107

Usa el cmpcomando. Esto saldrá limpiamente si son binarios iguales, o imprimirá donde ocurre la primera diferencia y saldrá.

bobjandal
fuente
9
Para el caso de uso, el OP describe que en mi humilde opinión cmpes más eficiente que diff. Entonces preferiría esto.
halloleo
55
Tengo un script de shell que se ejecuta:cmp $1 $2 && echo "identical" || echo "different"
steveha
2
¿se detiene el cmp cuando encuentra la primera diferencia y lo muestra o pasa al final de los archivos?
sop
cmptiene modo "silencioso": -s, --quiet, --silent- suppress all normal output. Todavía no lo hice pero creo que se detendrá en la primera diferencia si hay una.
Victor Yarema el
90

Encontré que Visual Binary Diff era lo que estaba buscando, disponible en:

  • Ubuntu:

    sudo apt install vbindiff
    
  • Arch Linux:

    sudo pacman -S vbindiff
    
  • Mac OS X a través de MacPorts :

    port install vbindiff
    
  • Mac OS X a través de Homebrew:

    brew install vbindiff
    
shao.lo
fuente
1
Bien ... pensé / solo quería saber si los archivos diferían; pero poder ver las diferencias exactas fácilmente fue mucho más útil. Tiende a fallar cuando llegué al final del archivo, pero no importa, todavía funcionaba.
Jeremy
2
Se ha dicho varias veces, ¡pero este es un pequeño gran programa! (digo también en homebrew)
johncip
2
Esta debería ser la respuesta aceptada, ya que es un método muy superior a la salida suave e inútil del comando canonical diff.
Gearoid Murphy
1
Esta es la mejor herramienta para la diferencia binaria.
Carla Camargo
17

Use sha1 para generar suma de comprobación:

sha1 [FILENAME1]
sha1 [FILENAME2]
Scott Presnell
fuente
3
Si solo tuviera una suma de comprobación para uno de los archivos, esto sería útil, pero si tiene ambos archivos en el disco, esto es innecesario. diffy cmpambos le dirán si difieren sin ningún esfuerzo adicional.
johncip
1
¿No es en sha1sumlugar de sha1?
kol
2
sha1 en NetBSD, sha1sum en Linux
Scott Presnell
2
Hay dos archivos que devolverán el mismo resultado a pesar de ser diferentes: shattered.io
mik
2
SHA1 ya tiene una colisión pública ( shattered.io ) y probablemente también una no pública. Una colisión se puede utilizar para generar innumerables archivos en colisión. Utilice SHA2 para el hash en su lugar.
Michal Ambroz
12

Terminé usando hexdump para convertir los archivos binarios a su representación hexadecimal y luego los abrí en meld / kompare / cualquier otra herramienta diff. A diferencia de ti, buscaba las diferencias en los archivos.

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

meld tmp/hex1.txt tmp/hex2.txt
simotek
fuente
1
Úselo hexdump -v -e '/1 "%02x\n"'si desea diferenciar y ver exactamente qué bytes se insertaron o eliminaron.
William Entriken
Meld también funciona con archivos binarios cuando no se convierten a hexadecimal primero. Muestra valores hexadecimales para cosas que no están en el conjunto de caracteres, de lo contrario caracteres normales, lo cual es útil con archivos binarios que también contienen texto ascii. Muchos lo hacen, al menos comienzan con una cuerda mágica.
Felix Dombek
7

Puede usar la función hash MD5 para verificar si dos archivos son iguales, con esto no puede ver las diferencias en un nivel bajo, pero es una forma rápida de comparar dos archivos.

md5 <filename1>
md5 <filename2>

Si los dos hashes MD5 (la salida del comando) son iguales, entonces, los dos archivos no son diferentes.

Rikki
fuente
77
¿Puedes explicar tus votos negativos por favor? SHA1 tiene 4 votos a favor, y si el OP cree que existe la posibilidad de que los dos archivos sean iguales o similares, las posibilidades de una colisión son leves y no son dignas de una votación negativa MD5, sino una votación ascendente SHA1 que no sea porque escuchó que debería hacer hash contraseñas con SHA1 en lugar de MD5 (ese es un problema diferente).
Rikki
2
no estoy seguro de la razón, pero un cmp puro será más eficiente que calcular cualquier función hash de los archivos y compararlos (al menos para solo 2 archivos)
Paweł Szczur
1
si los dos archivos son grandes y están en el mismo disco (no ssd), la variante md5 o sha * podría ser más rápida porque los discos pueden leer los dos archivos secuencialmente, lo que ahorra muchos movimientos de cabeza
Daniel Alder
77
Voté en contra porque publicaste una variante menor de una solución anterior (mala), cuando debería haber sido un comentario.
johncip
6

Use el comando cmp. Consulte Archivos binarios y Forzar comparaciones de texto para obtener más información.

cmp -b file1 file2
usuario2008151314
fuente
1
-bno compara archivos en "modo binario". En realidad, "con GNU cmp, también puede usar la opción -bo --print-bytespara mostrar la representación ASCII de esos bytes". Esto es exactamente lo que encontré usando la URL del manual que ha proporcionado.
Victor Yarema el
Victor Yarema, no sé a qué te refieres con "modo binario". cmpEs inherentemente una comparación binaria en mi opinión. La -bopción simplemente imprime el primer byte que es diferente.
H2ONaCl
4

Para encontrar defectos de memoria flash, tuve que escribir este script que muestra todos los bloques de 1K que contienen diferencias (no solo el primero como lo cmp -bhace)

#!/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

Salida:

   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 $

Descargo de responsabilidad: pirateé el guión en 5 min. No admite argumentos de línea de comandos ni admite espacios en los nombres de archivo

Daniel Alder
fuente
Obtengo "r: no encontrado" (usando GNU linux)
unseen_rider
@unseen_rider, ¿qué caparazón, qué línea? Llame al script usando sh -xpara depuración
Daniel Alder
Esto es mediante la llamada al script desde la terminal. La línea es 9.
unseen_rider
@unseen_rider No puedo ayudarte de esta manera. El guión está bien. Publique su salida de depuración en pastebin.com . Puede ver aquí lo que quiero decir: pastebin.com/8trgyF4A . Además, por favor dime la salida dereadlink -f $(which sh)
Daniel Alder
El último comando da /bin/dash. Actualmente creando pegar en pastebin.
unseen_rider
4

Diferenciar con las siguientes opciones haría una comparación binaria para verificar si los archivos son diferentes y generaría si los archivos también son los mismos:

diff -qs {file1} {file2}

Si está comparando dos archivos con el mismo nombre en diferentes directorios, puede usar este formulario en su lugar:

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

OS X El Capitan

DKroot
fuente
3

Prueba diff -s

Respuesta corta: corre diffcon el -sinterruptor.

Respuesta larga: sigue leyendo.


Aquí hay un ejemplo. Comencemos creando dos archivos con contenido binario aleatorio:

$ 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

Ahora hagamos una copia del primer archivo:

$ cp test1.bin copyoftest1.bin

Ahora test1.bin y test2.bin deberían ser diferentes:

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

... y test1.bin y copyoftest1.bin deben ser idénticos:

$ diff test1.bin copyoftest1.bin

¡Pero espera! ¿Por qué no hay salida?

La respuesta es: esto es por diseño. No hay salida en archivos idénticos.

Pero hay diferentes códigos de error:

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

$ echo $?
1


$ diff test1.bin copyoftest1.bin

$ echo $?
0

Ahora, afortunadamente, no tiene que verificar los códigos de error cada vez porque puede usar el interruptor -s(o --report-identical-files) para hacer que diff sea más detallado:

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

Radiff2 es una herramienta diseñada para comparar archivos binarios, similar a la forma en que los diferenciales regulares comparan archivos de texto.

Prueba radiff2cuál es parte del radare2desensamblador. Por ejemplo, con este comando:

radiff2 -x file1.bin file2.bin

Obtiene una salida de dos columnas con bastante formato donde se resaltan las diferencias.

divertido
fuente
1

Mis favoritos usando xxd hex-dumper del paquete vim:

1) usando vimdiff (parte de 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 '  \|  '
Michal Ambroz
fuente
0
md5sum binary1 binary2

Si el md5sum es igual, los binarios son iguales

P.ej

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
ashish
fuente
1
No exactamente. Solo la posibilidad es alta.
sawa
¿Cuál es la probabilidad de fallar?
Ashish
Delgado, pero peor que usar alguna variante de diff, sobre la cual no hay razón para preferirlo.
sawa
Tendría que cambiar el hash MD5 a SHA2 para que este consejo sea práctico. En la actualidad, cualquier computadora portátil puede generar colisiones en MD5 y, basándose en este prefijo de colisión único (2 archivos del mismo tamaño, el mismo prefijo y el mismo MD5) para generar un número infinito de archivos en colisión (que tienen el mismo prefijo, un bloque de colisión diferente, el mismo sufijo)
Michal Ambroz
-1

Hay una forma relativamente simple de verificar si dos archivos binarios son iguales.

Si utiliza la entrada / salida de archivos en un lenguaje de programación; puede almacenar cada bit de ambos archivos binarios en sus propias matrices.

En este punto, la verificación es tan simple como:

if(file1 != file2){
    //do this
}else{
    /do that
}
Acab Devoid
fuente