Calcular la suma de comprobación MD5 de un directorio

29

Estoy buscando una forma rápida de comparar el contenido del directorio. ¿Es posible hacer una suma de md5 (o suma de verificación equivalente) de un directorio completo?

Usando Ubuntu Linux

pez globo
fuente
También es posible que desee considerar el uso de diff para comparar directorios que realmente le mostrarán dónde difieren los directorios. unixtutorial.org/2008/06/how-to-compare-directories-in-unix
Kibbee
@Kibbee Para evitar eso, debe tener en cuenta algo que no sea el contenido de datos de cada archivo y exactamente cómo suma los archivos. Dado: [sumas de verificación] 1. A (Directorio) - Archivo1 [ABC] - Archivo2 [CBA] 2. B (Directorio) - Archivo1 [ABC] - B1 (Directorio) - Archivo2 [CBA] 3. C (Directorio) - Archivo4 [ABC] - Archivo5 [CBA] 4. D (Directorio) - Archivo1 copia [ABC] - Archivo2 copia [CBA] El directorio A y B no son idénticos aunque contienen los mismos archivos (aunque en B1 , el archivo2 está en un subdirectorio) . Según su ejemplo, A y C se considerarían idénticos porque
Jacob Lyles

Respuestas:

36

Seguro - md5sum directory/*

Si necesita algo un poco más flexible (por ejemplo, para la recurrencia del directorio o la comparación de hash), intente con md5deep.

apt-get install md5deep
md5deep -r directory

Para comparar una estructura de directorio, puede darle una lista de hashes para comparar:

md5deep -r -s /directory1 > dir1hashes
md5deep -r -X dir1hashes /directory2

Esto generará todos los archivos en el directorio2 que no coinciden con el directorio1.

Esto no mostrará archivos que se hayan eliminado del directorio1 o archivos que se hayan agregado al directorio2.

Shane Madden
fuente
No es lo que quise decir, sino lo que quería :) Quise decir de forma recursiva y obtener UN hash al final, pero creo que esto se puede hacer con md5deep -l y el hash de la salida en sí.
pez globo
1
El orden del hash no es coherente, por lo que tendría que ordenar la salida antes del hash
pez globo
1
Para obtener un orden determinista, utilice el -j0que deshabilita el subprocesamiento múltiple (consulte la página del manual)
Johann
1
@ ShaneMadden ♦ Instalé md5deepcon sudo apt-get install md5deepencendido Ubuntu 16.04pero cuando intenté leer la página de manual me dice que> No hay entrada manual para md5deep
Kasun Siyambalapitiya
27

Si desea ver qué es diferente (en todo caso) entre dos directorios, rsync sería una buena opción.

rsync --archive --dry-run --checksum --verbose /source/directory/ /destination/directory

Esto mostrará una lista de los archivos que son diferentes.

JakePaulus
fuente
2
diff -qr /source/directory/ /destination/directory/también mostraría archivos que difieren.
Konerak
¿Hay alguna manera de realizar una comparación bit a bit en lugar de sumas de verificación? Puede ser más rápido en unidades locales.
Ali
Muy agradable. Funciona si el origen o el destino también son carpetas remotas, por ejemplousername@hostname:/destination/directory
Thalis K.
11

Creo que respondí a este antes con esta respuesta:

find . -xtype f -print0 | xargs -0 sha1sum | cut -b-40 | sort | sha1sum

da: b1a5b654afee985d5daccd42d41e19b2877d66b1

la idea es que hash todos los archivos corten los hash uno por línea, los clasifique y el hash produzca un solo hash. Esto no depende de los nombres de los archivos.

Dan D.
fuente
5

La aplicación cfv es bastante útil, no solo puede verificar y crear sumas de verificación MD5, también puede hacer CRC32, sha1, torrent, par, par2.

para crear un archivo de suma de verificación CRC32 para todos los archivos en el directorio actual:

cfv -C

para crear un archivo de suma de comprobación MD5 para todos los archivos en el directorio actual:

cfv -C -t md5 -f "directorio actual.md5sums"

Para crear un archivo de suma de comprobación separado para cada subdirectorio:

cfv -C -r

Para crear un archivo de suma de verificación "super" que contenga archivos en todos los subdirectorios:

cfv -C -rr
Hubert Kario
fuente
4

Utilicé hashdeep, como se explica en esta respuesta de askubuntu: Verifique la corrección de los archivos copiados :

Para calcular las sumas de verificación:

 $ cd <directory1>
 $ hashdeep -rlc md5 . > ~/hashOutput.txt

Para verificar y enumerar las diferencias:

 $ cd <directory2>
 $ hashdeep -ravvl -k ~/hashOutput.txt .
 hashdeep: Audit passed
    Input files examined: 0
   Known files expecting: 0
           Files matched: 13770
 Files partially matched: 0
             Files moved: 0
         New files found: 0
   Known files not found: 0

Esto tiene una ventaja sobre md5deep en que mostrará archivos renombrados (movidos), agregados y eliminados, así como evitar el problema con archivos de longitud 0 señalados en la parte inferior de http://www.meridiandiscovery.com/how- a / validating-copy-results-using-md5deep .

Argyle
fuente
3

Esto funcionó para mí: (ejecútelo mientras esté en el directorio que le interesa)

md5deep -rl . | awk '{print $1}' | sort -n | md5sum
pantalones de gato
fuente
1

Puede crear sumas MD5 de cada archivo, ordenar estas sumas de verificación alfabéticamente y tenerlas (con o sin líneas nuevas). Dado que MD5 es criptográfico, debería funcionar bien con hashes de hashes.

Debe haber un cierto orden de cosas, de lo contrario obtendrá resultados diferentes para directorios iguales.

Y debe tener en cuenta que la adición de algún archivo a una dir cambiará por completo el resultado, incluso si era sólo una .directoryde .DS_Storearchivo.

Martin Ueding
fuente
Técnicamente, uno podría obtener el mismo hash para diferentes directorios. Si el directorio A tenía 2 archivos con los contenidos 'ab' y 'c' y el directorio B tenía 2 archivos con el contenido 'a' y 'bc', entonces el hash solo los datos en los archivos producirían los mismos resultados, aunque tengan archivos con diferentes contenidos Ni siquiera estoy seguro de cómo se definiría el MD5Sum de un directorio.
Kibbee
1

Como un caso específico, supongamos que desea copiar algunos archivos del directorio1 al directorio2 y luego desea verificar una copia exitosa utilizando una comparación md5.

Primero. cd al directorio1 y escriba:

find -type f -exec md5sum "{}" \; > ~/Desktop/md5sum.txt

que creará un archivo de referencia que contiene una suma md5 para cada archivo en el directorio1. Una vez hecho esto, todo lo que tiene que hacer es cd al directorio2 y escribir:

md5sum -c ~/Desktop/md5sum.txt

El programa md5sum obtiene cada ruta del archivo md5sum.txt, calcula el md5sum de ese archivo en la carpeta de destino y luego lo compara con la suma que ha almacenado en el archivo.

Una vez que se complete el proceso, obtendrá un resumen como 'Algunos archivos no coincidieron' o algo así.

Joel
fuente
1

He tenido la necesidad de verificar la integridad de las copias de seguridad / réplicas que contienen una gran cantidad de archivos y terminé escribiendo un programa de línea de comandos llamado MassHash. Está escrito en Python. Un lanzador GTK + también está disponible. Es posible que desee verlo ...

http://code.google.com/p/masshash/

Jonathan
fuente