md5sum en archivos grandes

md5sum en archivos grandes

Contexto:

Tengo una unidad de terabytes grande con varios tipos de archivos multimedia grandes, archivos de imágenes ISO, etc. Me gustaría verificar su contenido usando md5sumel primer megabyte debido a la velocidad/rendimiento.

Puedes crear una suma como esta:

FILE=four_gig_file.iso
SUM=$(head -c 1M "$FILE" | md5sum)
printf "%s *%s\n" ${SUM%-} "$FILE" >>test.md5

¿Cómo verificarías esto si la firma del primer megabyte es diferente a la del archivo completo?

He visto esto hecho en otros idiomas, pero me pregunto cómo hacerlo enIntento. He experimentado con varias md5sum -cpermutaciones que involucran tuberías y todo eso.


En lugar de utilizar md5sum -c, ¿tendría que volver a calcular los hashes en un archivo nuevo y luego diferenciarlos?

Puedes usar un

find /directory/path/ -type f -print0 | xargs -0 md5sum blah blah

para trabajar en una gran cantidad de archivos.

PD:Rsync no es una opción

ACTUALIZACIÓN 2: Tal como está:

Usando head, find y md5sum; Luego, se podría crear un archivo desde el directorio de origen con bastante rapidez y luego verificarlo con diff en el otro lado después de calcular el destino. ¿Existen frases ingeniosas o guiones para esto?

Respuesta1

Verificar el contenido muestreando solo el primer megabyte de un archivo probablemente no detectará si algunos de los archivos más grandes han sido corruptos, dañados o alterados de una forma u otra. La razón es que solo le estás dando al algoritmo hash un megabyte de datos cuando puede haber cientos de otros megabytes que podrían estar desactivados. Incluso un bit en la posición incorrecta daría una firma diferente.

Si lo que desea verificar es la integridad de los datos, será mejor que utilice el algoritmo CRC32. Es más rápido que MD5. Aunque es posible falsificar/modificar un archivo para que parezca que tiene la firma CRC32 correcta, no es probable que fragmentos aleatorios de corrupción lo hagan alguna vez.

Actualizar:

Aquí hay una buena frase para realizar la suma de comprobación md5 basada en 1 megabyte en cada archivo:

find ./ -type f -print0 | xargs -0 -n1 -I{} sh -c "echo '{}' >> output.md5 && head -c 1M '{}' | md5sum >> output.md5"

Reemplace md5sum con cksum si lo desea. Observe que elegí incluir el nombre del archivo en el resultado. Esto se debe a que la cadena del nombre del archivo no se transmite cuando no le proporcionas a md5sum el archivo completo.

Respuesta2

Una solución/ejemplo ligeramente modificado, que utiliza el argumento find -size para limitar solo archivos mayores a 10 M y calcula md5sum desde la primera parte de 1 M y la última de 1 M del archivo.

find . -type f -a -size +10M -print0 | xargs -0 -n1 -I{} sh -c 'echo "$( (head -c 1M '{}'; tail -c 1M '{}' ) | md5sum) {} "'

información relacionada