winmd5 verificar usar comprobar como checar archivo linux folders md5sum

usar - verificar sha256 linux



¿Cómo puedo calcular una suma de comprobación md5 de un directorio? (15)

Cree un archivo de archivo tar sobre la marcha y md5sum a md5sum :

tar c dir | md5sum

Esto produce un único md5sum que debe ser exclusivo de su archivo y subdirectorio. No se crean archivos en el disco.

Necesito calcular una suma de comprobación de suma md5 para todos los archivos de un tipo particular ( *.py por ejemplo) colocados 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 única suma de comprobación de resumen que identificará de manera única el directorio como un todo, incluido el contenido de todos sus subdirectorios.


En aras de la integridad, hay md5deep (1) ; no es directamente aplicable debido al requisito de filtro * .py, pero debería estar bien junto con find (1).


GNU encuentra

find /path -type f -name "*.py" -exec md5sum "{}" +;


Hay dos soluciones más:

Crear:

du -csxb /path | md5sum > file ls -alR -I dev -I run -I sys -I tmp -I proc /path | md5sum > /tmp/file

Comprobar:

du -csxb /path | md5sum -c file ls -alR -I dev -I run -I sys -I tmp -I proc /path | md5sum -c /tmp/file


La sugerencia de ire_and_curses de usar tar c <dir> tiene algunos problemas:

  • tar procesa las entradas de directorio en el orden en que están almacenadas en el sistema de archivos, y no hay forma de cambiar este orden. Esto efectivamente puede arrojar resultados completamente diferentes si tiene el "mismo" directorio en diferentes lugares, y no sé cómo solucionarlo (tar no puede "ordenar" sus archivos de entrada en un orden particular).
  • Por lo general, me importa si los números groupid y ownerid son los mismos, no necesariamente si la representación de cadena del grupo / propietario es la misma. Esto está en línea con lo que hace, por ejemplo, rsync -a --delete : sincroniza prácticamente todo (menos xattrs y acls), pero sincroniza el propietario y el grupo en función de su ID, no en la representación de cadenas. Por lo tanto, si sincronizó con un sistema diferente que no necesariamente tiene los mismos usuarios / grupos, debe agregar el --numeric-owner al tar
  • tar incluirá el nombre del archivo del directorio que está comprobando, algo que debe tener en cuenta.

Mientras no haya una solución para el primer problema (o a menos que esté seguro de que no lo afecta), no utilizaría este enfoque.

Las soluciones basadas en find propuestas anteriormente tampoco son buenas porque solo incluyen archivos, no directorios, lo que se convierte en un problema si la suma de verificación debe tener en cuenta los directorios vacíos.

Finalmente, la mayoría de las soluciones sugeridas no se clasifican consistentemente, porque la intercalación puede ser diferente en todos los sistemas.

Esta es la solución que se me ocurrió:

dir=<mydir>; (find "$dir" -type f -exec md5sum {} +; find "$dir" -type d) | LC_ALL=C sort | md5sum

Notas sobre esta solución:

  • LC_ALL=C es para garantizar un orden de clasificación confiable en todos los sistemas
  • Esto no diferencia entre un directorio "named / nwithanewline" y dos directorios "named" y "withanewline", pero la posibilidad de que eso ocurra parece muy poco probable. Uno generalmente lo arregla con una bandera -print0 para find pero como hay otras cosas sucediendo aquí, solo puedo ver soluciones que harían el comando más complicado de lo que vale.

PD: uno de mis sistemas usa un -exec -print0 limitado que no admite -exec ni -print0 flags, y también agrega ''/'' para denotar directorios, mientras que findutils find no parece, por lo que para esta máquina necesito ejecutar :

dir=<mydir>; (find "$dir" -type f | while read f; do md5sum "$f"; done; find "$dir" -type d | sed ''s#/$##'') | LC_ALL=C sort | md5sum

Afortunadamente, no tengo archivos / directorios con líneas nuevas en sus nombres, por lo que este no es un problema en ese sistema.


Si desea realmente la independencia de los atributos del sistema de archivos y de las diferencias de bit de algunas versiones de tar, puede usar cpio:

cpio -i -e theDirname | md5sum


Si quieres un md5sum que abarque todo el directorio, haría algo así como

cat *.py | md5sum


Si solo te importan los archivos y no los directorios vacíos, esto funciona muy bien:

find /path -type f | sort -u | xargs cat | md5sum


Suma de verificación todos los archivos, incluidos tanto el contenido como sus nombres de archivo

grep -ar -e . /your/dir | md5sum | cut -c-32

Igual que arriba, pero solo incluye archivos * .py

grep -ar -e . --include="*.py" /your/dir | md5sum | cut -c-32

También puedes seguir enlaces simbólicos si quieres

grep -aR -e . /your/dir | md5sum | cut -c-32

Otras opciones que podrías considerar usar con grep

-s, --no-messages suppress error messages -D, --devices=ACTION how to handle devices, FIFOs and sockets; -Z, --null print 0 byte after FILE name -U, --binary do not strip CR characters at EOL (MSDOS/Windows)


Técnicamente, solo necesita ejecutar ls -lR *.py | md5sum ls -lR *.py | md5sum . A menos que esté preocupado por alguien que modifique los archivos y los toque de nuevo a sus fechas originales y nunca cambie los tamaños de los archivos, el resultado de ls le dirá si el archivo ha cambiado. Mi unix-foo es débil, por lo que es posible que necesite algunos más parámetros de línea de comandos para obtener la hora de creación y la hora de modificación para imprimir. También te diré si los permisos en los archivos han cambiado (y estoy seguro de que hay interruptores para apagarlos si no te importa eso).


Tuve el mismo problema, así que se me ocurrió esta secuencia de comandos 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 de la corriente directorio o desde un subdirectorio si dicho argumento se pasa en $ 1

#!/bin/bash if [ -z "$1" ] ; then # loop in current dir ls | while read line; do ecriv=`pwd`"/"$line if [ -f $ecriv ] ; then md5sum "$ecriv" elif [ -d $ecriv ] ; then sh myScript "$line" # call this script again fi done else # if a directory is specified in argument $1 ls "$1" | while read line; do ecriv=`pwd`"/$1/"$line if [ -f $ecriv ] ; then md5sum "$ecriv" elif [ -d $ecriv ] ; then sh myScript "$line" fi done fi


Una solución que funcionó mejor para mí:

find "$path" -type f -print0 | sort -z | xargs -r0 md5sum | md5sum

Motivo por el cual funcionó mejor para mí:

  1. maneja nombres de archivos que contienen espacios
  2. Ignora los metadatos del sistema de archivos
  3. Detecta si el archivo ha sido renombrado

Problemas con otras respuestas:

Los metadatos del sistema de archivos no se ignoran para:

tar c - "$path" | md5sum

No maneja los nombres de archivos que contienen espacios ni detecta si el archivo ha sido renombrado:

find /path -type f | sort -u | xargs cat | md5sum


Usando md5deep :

md5deep -r FOLDER | awk ''{print $1}'' | sort | md5sum


Yo uso HashCopy para hacer esto. Puede generar y verificar MD5 y SHA en un solo archivo o directorio. Se puede descargar desde www.jdxsoftware.org.


find /path/to/dir/ -type f -name "*.py" -exec md5sum {} + | awk ''{print $1}'' | sort | md5sum

El comando find enumera todos los archivos que terminan en .py. El md5sum se calcula para cada archivo .py. awk se usa para eliminar los md5sums (ignorando los nombres de archivo, que pueden no ser únicos). Los md5sums están ordenados. El md5sum de esta lista ordenada se devuelve.

Lo he probado copiando un directorio de prueba:

rsync -a ~/pybin/ ~/pybin2/

Cambié el nombre de algunos de los archivos en ~ / pybin2.

El comando find...md5sum devuelve el mismo resultado para ambos directorios.

2bcf49a4d19ef9abd284311108d626f1 -