¿Cómo hago una diferencia binaria en dos archivos de tamaño idéntico en Linux?

37

Tengo dos archivos de tamaño idéntico, y necesito hacer una diferencia binaria para verificar si son iguales.

Actualmente estoy corriendo, diff file1.img file2.imgpero me está tomando bastante tiempo procesar mis archivos de 4 GB. ¿Es esta la forma más eficiente de hacer esto?

Jon Cage
fuente

Respuestas:

45

cmpestá diseñado para encontrar diferencias en archivos binarios. También puede probar la suma de comprobación ( sum) y comparar los hashes.

mpez0
fuente
21

Una de las formas más comunes de determinar si dos archivos son idénticos (suponiendo que sus tamaños coincidan) es usar un programa para crear un " hash " (esencialmente una huella digital) de un archivo. Los más comunes son md5sumy sha1sum.

Por ejemplo:

$ md5sum file1 file2
e0e7485b678a538c2815132de7f9e878  file1
4a14aace18d472709ccae3910af55955  file2

Si tiene muchos archivos que necesita verificar, por ejemplo, si está transfiriendo un directorio lleno de archivos de un sistema a otro, puede redirigir la salida del sistema original a un archivo, luego md5sum/ sha1sumpuede usar automáticamente ese archivo para indicar usted qué archivos son diferentes:

$ md5sum file1 file2 > MD5SUMS
... copy file1, file2, MD5SUMS across
$ md5sum --check MD5SUMS
file1: OK
file2: OK
Adam Batkin
fuente
2
MD5 no siempre es confiable para esto: digg.com/security/…
Jon Cage
28
En realidad, MD5 es confiable para las comprobaciones de integridad básicas. Simplemente no se considera tan criptográficamente fuerte como alguna vez pensamos. Si le preocupan los hackers, no use MD5, pero si solo quiere saber si algunos archivos copiados de un CD se corrompieron, o si su compilador escupe archivos idénticos cada vez, MD5 es más que adecuado.
Adam Batkin
3

Si solo quiero saber si son iguales, prefiero usar sha1sum si está disponible, o md5 como alternativa.

Si quiero saber qué tan diferentes son, o dónde son diferentes, una cosa que funciona es ponerlos a ambos a través de od ('volcado octal', que generalmente tiene una opción hexadecimal) para crear archivos temporales y luego diferirlos.

JustJeff
fuente
2
Si desea saber si son dos archivos iguales, no creo que usar sha1sum (o md5sum) pueda ser más eficiente que solo diff (ya que esta era la pregunta original), porque incluso si los dos ( grandes) difieren al principio), los leerá por completo antes de saber que difieren.
Pierre
@Pierre PERO, el hash y la firma criptográfica funcionan en dispositivos remotos.
VasyaNovikov
1

Acabo de ejecutar algunos puntos de referencia en un archivo de más de 100 MB. diff fue el más rápido, mientras que cmp quedó en segundo lugar, y el uso de md5sum fue el último.

# 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

Volví a realizar el ejercicio con un archivo de 4,3 GB y tuve que eliminar y volver a crear el archivo con dd ya que el almacenamiento en caché de RAM estaba afectando en gran medida los resultados.

$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

En base a estos resultados, recomendaría mover los archivos a un montaje RAMFS y seguir con diff.

prohibidor
fuente
Me gusta que haya hecho un punto de referencia, pero 100 Mb no es representativo del caso del OP. 1,000Mb sería mucho mejor.
jpaugh
1
acordé por qué ejecuté las pruebas de 4.3 conciertos unos meses más tarde. Realmente tomó esfuerzo evitar el almacenamiento en caché del sistema operativo.
Prohibidor
Me imagino que sí. Pido disculpas por no leer la lectura de la mitad de su respuesta. (Todavía pensé que era lo suficientemente bueno para votar, incluso con solo ver el primer punto de referencia). FWIW, hay algo de magia del núcleo para deshabilitar el almacenamiento en caché de archivos. Tendría que hacer el punto de referencia yo mismo para ver cuáles funcionan realmente o son necesarios.
jpaugh