Generar suma de comprobación md5 para todos los archivos en un directorio

75

Me gustaría crear una lista de suma de verificación md5 para todos los archivos en un directorio.

Quiero cat filename | md5sum > ouptput.txt. Quiero hacer esto en 1 paso para todos los archivos en mi directorio.

Cualquier ayuda sería genial.

Walter Wayne Leutwyler
fuente
¿Cómo puedo encontrar el md5sum (suma de comprobación) de un archivo de copia de seguridad específico? -¿Cómo debería ser mi script? ¿Cuál es el comando para él

Respuestas:

110

Puede pasar md5summúltiples nombres de archivo o expansiones bash:

$ md5sum * > checklist.chk  # generates a list of checksums for any file that matches *
$ md5sum -c checklist.chk   # runs through the list to check them
cron: OK
database.sqlite3: OK
fabfile.py: OK
fabfile.pyc: OK
manage.py: OK
nginx.conf: OK
uwsgi.ini: OK

Si quieres ponerte elegante, puedes usar cosas como findprofundizar y filtrar los archivos, así como trabajar de forma recursiva:

find -type f -exec md5sum "{}" + > checklist.chk
Oli
fuente
1
♦ cómo usar lo anterior para obtener md5sumlos archivos dentro de los subdirectorios, md5sum *emitiendo lo anterior al nivel de subdirectorio diciendo ... es un directorio
Kasun Siyambalapitiya
Perdón por preguntar ejecutando find -type f -exec md5sum '{}' +y `find -type f -exec md5sum '{}' 'Pude obtenerlo. Gracias :)
Kasun Siyambalapitiya
Prefiero el aspecto de esta salida más:openssl md5 * > checklist.txt
ashley
1
Si estás usando una concha que es feliz para evaluar **de forma recursiva (como zsh), es aún más simple:md5sum **/* 2>/dev/null
Joost
12

Un gran programa de creación / verificación de suma de comprobación es rhash. Crea incluso archivos compatibles con SFV, y también los verifica.

Es compatible con md4, md5, sha1, sha512, crc32 y muchos otros.

Además, puede hacer creación recursiva (opción -r) como md5deep o sha1deep.

Por último, pero no menos importante, puede formatear la salida del archivo de suma de verificación; por ejemplo:

rhash --md5 -p '%h,%p\n' -r /home/

genera un archivo CSV que incluye la ruta completa de los archivos comenzando recursivamente con el /homedirectorio.

Encuentro extremadamente útil incluso la opción -e renombrar archivos insertando crc32 sum en el nombre.

Puede cambiar "md5sum" con "rhash" en los ejemplos de PhoenixNL72.

Marcolino
fuente
1
¿Qué hace exactamente '/ home /' aquí? Esta herramienta se ve bastante bien.
Andy Ibáñez
Creo que es un error, ciertamente es un error para mí. El -p es el formato para la salida. Lo corregiré
pbhj
7

Aquí hay dos ejemplos más extensos:

  1. Cree un archivo md5 en cada directorio que aún no tenga uno, con rutas absolutas:

    find "$PWD" -type d | sort | while read dir; do [ ! -f "${dir}"/@md5Sum.md5 ] && echo "Processing " "${dir}" || echo "Skipped " "${dir}" " @md5Sum.md5 already present" ; [ ! -f "${dir}"/@md5Sum.md5 ] &&  md5sum "${dir}"/* > "${dir}"/@md5Sum.md5 ; chmod a=r "${dir}"/@md5Sum.md5;done 
    
  2. Cree un archivo md5 en cada carpeta que aún no tenga uno: sin rutas, solo nombres de archivo:

    find "$PWD" -type d | sort | while read dir; do cd "${dir}"; [ ! -f @md5Sum.md5 ] && echo "Processing " "${dir}" || echo "Skipped " "${dir}" " @md5Sum.md5 allready present" ; [ ! -f @md5Sum.md5 ] &&  md5sum * > @md5Sum.md5 ; chmod a=r "${dir}"/@md5Sum.md5 ;done 
    

Lo que difiere entre 1 y 2 es la forma en que se presentan los archivos en el archivo md5 resultante.

Los comandos hacen lo siguiente:

  1. Construya una lista de nombres de directorio para la carpeta actual. (Árbol)
  2. Ordenar la lista de carpetas.
  3. Compruebe en cada directorio si existe el archivo @ md5sum.md5. Salida omitida si existe, salida Procesando si no existe.
  4. Si el archivo @ md5Sum.md5 no existe, md5Sum generará uno con las sumas de verificación de todos los archivos en la carpeta. 5) Establezca el archivo @ md5Sum.md5 generado como de solo lectura.

La salida de este script completo puede redirigirse a un archivo (.....; done> test.log) o canalizarse a otro programa (como grep). La salida solo le dirá qué directorios se omitieron y cuáles se han procesado.

Después de una ejecución exitosa, terminará con un archivo @ md5Sum.md5 en cada subdirectorio de su directorio actual

Llamé al archivo @ md5Sum.md5 para que aparezca en la parte superior del directorio en un recurso compartido de samba.

Los siguientes comandos pueden verificar todos los archivos @ md5Sum.md5:

find "$PWD" -name @md5Sum.md5 | sort | while read file; do cd "${file%/*}"; md5sum -c @md5Sum.md5; done > checklog.txt

Luego puede grep checklog.txt usando grep -v OK para obtener una lista de todos los archivos que difieren.

Para regenerar un @ md5Sum.md5 en un directorio específico, cuando cambie o agregue archivos, por ejemplo, elimine el archivo @ md5Sum.md5 o cámbiele el nombre y vuelva a ejecutar el comando de generación.

PhoenixNL72
fuente
Comando n. ° 1 con rutas completas: md5sum "$ {dir}" / * no recoge archivos ocultos que comienzan con punto. Cualquier remedio?
user14654
Tarde para la fiesta, pero dado que md5sum quiere nombres de archivo (parece infeliz si le da un directorio) puede ser más fácil pedir ayuda: $ md5sum $ (encuentre "$ dir" -maxdepth 0 -tipo f) El "- tipo f "extrae archivos regulares y .hidden (también, find tiene muchas opciones, pero puede ser muy útil). Omita la parte "-maxdepth 0" si desea que todo sea recursivo. Nota: esto es frágil si los nombres de archivo tienen espacios incrustados, entonces puede leer en xargs y -0 ( es.wikipedia.org/wiki/Xargs )
jgreve
0

Llegué a este problema, y ​​aunque las soluciones anteriores son elegantes, quería un truco rápido y sucio para esta situación: 1 directorio, con subdirectorios de un nivel en su interior.

Entonces, ingrese el directorio en un shell y ejecute:

md5sum * */* 2>/dev/null > md5sum.md5

Esto obtiene todos los archivos en el directorio de nivel superior, elimina la advertencia de error acerca de que los subdirectorios son directorios y luego ejecuta md5sums en el contenido del subdirectorio. Ventaja: fácil de recordar, hace exactamente lo que se supone que debe hacer. Siempre me confundo al encontrar la sintaxis y nunca puedo recordarla, así que no es necesario hacer un bucle, etc., al tratar con espacios en los nombres de directorio, este revestimiento funcionó bien. No es una solución potente y robusta, no sirve para> 1 nivel de subdirectorios, pero es una solución rápida y fácil para el problema.

Lagarto
fuente