Necesito calcular una suma de comprobación md5 de resumen para todos los archivos de un tipo particular ( *.py
por ejemplo) ubicados bajo un directorio y todos los subdirectorios.
¿Cuál es la mejor manera de hacer eso?
Editar: Las soluciones propuestas son muy buenas, pero esto no es exactamente lo que necesito. Estoy buscando una solución para obtener una suma de comprobación de resumen única que identifique de forma exclusiva el directorio en su conjunto, incluido el contenido de todos sus subdirectorios.
Respuestas:
El comando find enumera todos los archivos que terminan en .py. El md5sum se calcula para cada archivo .py. awk se usa para seleccionar md5sums (ignorando los nombres de archivo, que pueden no ser únicos). Los md5sums están ordenados. Se devuelve el md5sum de esta lista ordenada.
He probado esto copiando un directorio de prueba:
Cambié el nombre de algunos de los archivos en ~ / pybin2.
El
find...md5sum
comando devuelve la misma salida para ambos directorios.fuente
awk ...
parte si considera que el diseño es parte de la firma.Cree un archivo de archivo tar sobre la marcha y canalice eso a
md5sum
:Esto produce un único md5sum que debería ser exclusivo para la configuración de su archivo y sub-directorio. No se crean archivos en el disco.
fuente
ls -alR dir | md5sum
. Esto es aún mejor sin compresión, solo una lectura. Es único porque el contenido contiene el tiempo de modificación y el tamaño del archivo;)z
para gzip oj
para bzip2. Yo tampoco lo he hecho.tar
usar el mismo conjunto de archivos dos veces, o en dos computadoras diferentes, produzca el mismo resultado exacto.La sugerencia de uso de ire_and_curses
tar c <dir>
tiene algunos problemas:rsync -a --delete
: sincroniza prácticamente todo (menos xattrs y acls), pero sincronizará el propietario y el grupo en función de su ID, no en la representación de cadena. Entonces, si se sincronizó con un sistema diferente que no necesariamente tiene los mismos usuarios / grupos, debe agregar el--numeric-owner
indicador a tarMientras no haya una solución para el primer problema (o a menos que esté seguro de que no le afecta), no usaría este enfoque.
Las
find
soluciones basadas propuestas anteriormente tampoco son buenas porque solo incluyen archivos, no directorios, lo que se convierte en un problema si la suma de comprobación debe tener en cuenta los directorios vacíos.Finalmente, la mayoría de las soluciones sugeridas no se clasifican de manera consistente, porque la intercalación puede ser diferente entre los sistemas.
Esta es la solución que se me ocurrió:
Notas sobre esta solución:
LC_ALL=C
objetivo es garantizar un orden de clasificación confiable en todos los sistemas.-print0
indicador,find
pero dado que hay otras cosas aquí, solo puedo ver soluciones que harían que el comando sea más complicado de lo que vale la pena.PD: uno de mis sistemas usa un busybox limitado
find
que no admite-exec
ni-print0
marcas, y también agrega '/' para denotar directorios, mientras que findutils find no parece, por lo que para esta máquina necesito ejecutar:Afortunadamente, no tengo archivos / directorios con nuevas líneas en sus nombres, por lo que este no es un problema en ese sistema.
fuente
Si solo le interesan los archivos y no los directorios vacíos, esto funciona bien:
fuente
En aras de la exhaustividad, hay md5deep (1) ; no es directamente aplicable debido al requisito de filtro * .py pero debería funcionar bien junto con find (1).
fuente
Una solución que funcionó mejor para mí:
Razón por la que funcionó mejor para mí:
Problemas con otras respuestas:
Los metadatos del sistema de archivos no se ignoran para:
tar c - "$path" | md5sum
No maneja nombres de archivos que contienen espacios ni detecta si el archivo ha sido renombrado:
fuente
Si desea un md5sum que abarque todo el directorio, haría algo como
fuente
cat **.py
| md5sumSuma de comprobación de todos los archivos, incluidos el contenido y sus nombres de archivo
Igual que el anterior, pero solo incluye archivos * .py
También puedes seguir enlaces simbólicos si quieres
Otras opciones que podría considerar usar con grep
fuente
GNU encontrar
fuente
Técnicamente solo necesitas correr
ls -lR *.py | md5sum
. A menos que le preocupe que alguien modifique los archivos y los devuelva a sus fechas originales y nunca cambie el tamaño de los archivos, la salida dels
debería decirle si el archivo ha cambiado. Mi unix-foo es débil, por lo que es posible que necesite más parámetros de línea de comandos para obtener el tiempo de creación y el tiempo de modificación para imprimir.ls
también le dirá si los permisos en los archivos han cambiado (y estoy seguro de que hay interruptores para desactivarlo si no le importa).fuente
touch
un archivo para cambiar su fecha (pero no su contenido), esperaría que la suma de verificación no se modifique.Utilizando
md5deep
:md5deep -r FOLDER | awk '{print $1}' | sort | md5sum
fuente
Tuve el mismo problema, así que se me ocurrió este script que solo enumera los md5sums de los archivos en el directorio y si encuentra un subdirectorio, se ejecuta nuevamente desde allí, para que esto suceda, el script debe poder ejecutarse a través del actual directorio o desde un subdirectorio si dicho argumento se pasa en $ 1
fuente
Si realmente desea la independencia de los atributos del sistema de archivos y de las diferencias de nivel de bits de algunas versiones de tar, puede usar cpio:
fuente
Hay dos soluciones más:
Crear:
Cheque:
fuente
md5sum
funcionó bien para mí, pero tuve problemas con lasort
clasificación de los nombres de los archivos. Entonces, en su lugar, ordené pormd5sum
resultado. También necesitaba excluir algunos archivos para crear resultados comparables.find . -type f -print0 \ | xargs -r0 md5sum \ | grep -v ".env" \ | grep -v "vendor/autoload.php" \ | grep -v "vendor/composer/" \ | sort -d \ | md5sum
fuente