Respuestas:
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 md5sum
y 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
/ sha1sum
puede 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
Encontré una solución: la herramienta cmp que viene con la mayoría de los sabores de Linux.
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.
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.