sha1sum ./path/to/directory/* | sha1sum
lo anterior se publicó como una forma de calcular una suma de un directorio que contiene archivos. Este comando falla si el directorio incluye más directorios. ¿Hay alguna manera de calcular de forma recursiva el sha1sum de un directorio de directorios de manera universal (sin ajustar un algoritmo personalizado al directorio particular en cuestión)?
find . -type f \( -exec sha1sum "$PWD"/{} \; \) | awk '{print $1}' | sort | sha1sum
@allquixoticGeneralmente me gusta el patrón "encontrar | xargs", así:
Debe usar "-print0" y "-0", en caso de que haya espacios en los nombres de archivo.
Sin embargo, esto es muy similar al patrón "find -exec cmd {}".
Vea una discusión que compara los dos patrones aquí: https://stackoverflow.com/questions/896808/find-exec-cmd-vs-xargs
fuente
find . -type f -print0 | xargs -0 sha1sum | awk '{print $1}' | sha1sum
.ACTUALIZACIÓN: Han pasado algunos años desde que publiqué esta respuesta y, mientras tanto, reescribí y mejoré el guión que presenté aquí varias veces. He decidido volver a publicar el nuevo script como una respuesta completamente nueva. Lo recomendaría mucho sobre este.
INTRODUCCIÓN
Observé que el orden en que el comando find genera los elementos encontrados dentro de un directorio varía dentro de directorios idénticos en diferentes particiones. Si está comparando los hashes del mismo directorio, no tiene que preocuparse por eso, pero si obtiene los hashes para asegurarse de que no se pierdan ni corrompan archivos durante una copia, debe incluir una línea adicional para ordenando el contenido del directorio y sus elementos. Por ejemplo, la respuesta de Matthew Bohnsack es bastante elegante:
Pero si lo está usando para comparar un directorio copiado con su original, enviaría la salida a un archivo txt que compararía con la lista de salida del otro directorio usando Kompare o WinMerge o simplemente obteniendo los hashes de cada lista . La cuestión es que, como el orden en que la herramienta de búsqueda generará el contenido puede variar de un directorio a otro, Kompare señalará muchas diferencias porque los hash no se calcularon en el mismo orden. No es un gran problema para los directorios pequeños, pero es bastante molesto si se trata de 30000 archivos. Por lo tanto, debe realizar los pasos adicionales de ordenar la salida para facilitar la comparación de las listas hash entre los dos directorios.
Esto ordenaría la salida de modo que los archivos con el mismo hash vayan a estar en las mismas líneas cuando se ejecute el programa de diferenciación (siempre que no falten archivos en el nuevo directorio).
Y EN EL ESCRITO ...
Aquí hay un guión que escribí. Hace lo mismo que hace la respuesta find / xarg, pero ordenará los archivos antes de obtener el sha1sum (manteniéndolos en el mismo directorio). La primera línea del script encuentra todos los archivos dentro del directorio de forma recursiva. El siguiente ordena los resultados alfabéticamente. Los siguientes dos, toman el contenido ordenado y agregan un sha1sum y comillas a los archivos en la lista ordenada, creando un gran script de shell que calcula cada hash de los archivos, uno a la vez y lo envía a content_sha1sum.txt.
Espero que esto ayude.
fuente
sort -z
(--zero-terminated
) es más fácil que jugar con un montón de archivos.INTRODUCCIÓN
Hace unos años, escribí y presenté (en este mismo hilo) un script que puede verificar las firmas hash de todos los archivos individuales en la estructura del directorio actual y mostrarlo como una lista en un archivo de texto.
Desde entonces, he refinado esta fórmula varias veces. He decidido volver a publicar mi script nuevo y mejorado aquí como una respuesta separada. Está escrito para sha256, pero cualquiera que quiera usar sha1 puede hacer una búsqueda simple y reemplazar en gedit para intercambiar sha256 con sha1. Personalmente, no he usado sha1 durante un par de años y no lo recomendaría, ya que está obsoleto y Google ha demostrado cómo puede verse comprometido .
Esto es lo que hace mi nuevo script:
Simplemente puede usar el script yendo al directorio que desea hacer hash e ingresando:
Alternativamente, puede llamar a este script desde otro directorio haciendo:
El script detectará si tiene privilegios de escritura en el directorio actual. Si lo hace, los resultados se guardarán en el directorio actual. Si no tiene privilegios de escritura o si su directorio actual está en un sistema de solo lectura (como un cdrom), los resultados se guardarán en el directorio de inicio del usuario actual.
El script detectará si algunos de los subdirectorios no son accesibles con los privilegios actuales del usuario. Si todos son legibles, entonces no se produce la elevación de privilegios, si no lo son, los privilegios del usuario se elevan a root.
Buscar se utiliza para buscar todos los archivos en la estructura de directorios actual (incluidos todos los subdirectorios). Ordenar se utiliza para asegurarse de que los resultados se emiten alfabéticamente. La lista resultante se somete a sha256sum y se envía a un archivo de texto.
Desde que escribí el antiguo script, adopté una filosofía de diseño de que los archivos temporales son malos y deben evitarse cuando sea posible, ya que dejan a los usuarios abiertos a la intromisión y manipulación por parte de terceros maliciosos. Por lo tanto, todos los datos de este nuevo script se manipulan como variables hasta el último minuto, donde los resultados se superan como un archivo de texto.
El archivo resultante en sí es hash y la ruta / hash se supera en el terminal. Me gusta tomar fotos de estos hashes con una cámara fuera de línea de la vieja escuela para asegurarme de que el archivo de resultados no haya sido alterado cuando lo consulte más adelante.
Los archivos de resultados antiguos se ignoran en el recuento. Facilita la comparación de resultados.
Aquí hay un ejemplo de la salida del terminal cuando ejecuto mi script:
Aquí hay un fragmento de la salida que se puede encontrar en 000_sha256sum_recurs_linux-headers-4.13.0-16-generic_d_22-04-2018_t_02.17.txt:
(continúa con otras 7000+ líneas como esta, pero se entiende la idea)
INSTALACIÓN
Abra una terminal e ingrese los siguientes comandos:
En nano, use Shif + Ctrl + v para pegar. Ctrl-O e Enter para guardar. Ctr-X sale. Pegue mi script allí:
(pegar después de #! / bin / bash)
Cuando salga de nano, asegúrese de salir del estado elevado ingresando:
PENSAMIENTOS FINALES
Esto solo funcionará si tiene instalado bash. He usado algunos Synthax para la manipulación de subcadenas que no funcionan con sh, dash, ksh o zsh. Todavía puede usar cualquiera de los otros shells como controladores diarios, pero es necesario instalar bash.
Las listas de salida se pueden comparar con una variedad de herramientas como: (en el terminal) diff, sdiff (y gráfico) difuso, kdiff, winmerge.
Mi archivo ordena la salida en función de la ruta, para que sea más fácil de leer por los humanos. He notado que el comando de clasificación funciona de manera diferente en diferentes distribuciones. Por ejemplo, en una distribución, las letras de MAYÚSCULAS tenían prioridad sobre las no mayúsculas y en la otra no. Esto afecta el orden de las líneas de los archivos de salida y podría dificultar la comparación de los archivos. Esto no debería presentar ningún problema si siempre usa el script en la misma distribución, pero puede hacerlo si se generaron listas hash en dos entornos diferentes. Esto se soluciona fácilmente clasificando los archivos hash una vez más para que las líneas se ordenen por hash en lugar de ruta:
fuente
#!/usr/bin/env bash
: también encontrará Bash en otros directorios, porque este último puede instalarse en / usr / bin en lugar de / bin , por ejemplo, mientras que env tiende a estar en / usr / bin en todo momento hasta donde me di cuenta. También vale la pena señalar que, dado que necesita Bash, puede usar[[ blah-blah ]]
una expresión condicional de doble paréntesis en lugar de una[ blah-blah ]
variante genérica de un solo paréntesis.Esto parece funcionar para mí:
EDITAR: esto solo mostrará todos los archivos contenidos en el árbol de directorios. Si se cambiara el nombre de un directorio, esto no lo detectaría. Tal vez algo como:
Lo haría. Aunque casi la misma respuesta que la otra
fuente
Otro truco podría ser usar tar para trocear los contenidos y metadatos del archivo:
fuente
Solución rápida, robusta y portátil.
A diferencia de algunas de las otras soluciones involucradas
tar
, la siguiente solución funciona en cualquier máquina que tenga las utilidades estándar de Unix, y es más rápida que todas las demás soluciones al paralelizar la suma de comprobación:Como utiliza una ordenación al final, no hay progreso en tiempo real, así que solo deje que se ejecute el comando.
Esto es lo que hacen los argumentos:
find . -type f
encuentra todos los archivos en el directorio actual y sus subdirectoriosxargs -d'\n'
divide la salida de find en líneas (si espera tener archivos con nuevas líneas, entonces haga lo habitualfind -print0 | xargs -0
)-P0 n1
se ejecutamd5sum
en procesos paralelos, utilizando el número máximo de procesos admitidos por la máquina (¡multi-núcleo!)sort -k 2
ordena por el segundo campo de lamd5sum
salida, que es la ruta completa a cada archivo (el primero es el MD5)md5sum
calcula una suma de comprobación de la lista de sumas de comprobación de archivos, de modo que obtiene una suma de comprobación del directorio completo en una línea, que puede comparar fácilmente visualmente en las ventanas de terminalAntes de decir que "MD5 ha sido comprometido", recuerde cuál es su modelo de amenaza. ¿Está tratando de asegurarse de que los archivos que copió de algún otro host o disco llegaron intactos? Entonces MD5 es más que suficiente, porque las posibilidades de que un archivo se corrompa en tránsito pero tenga el mismo MD5 son cero. Pero si tiene miedo de que un atacante tenga tiempo para reemplazar un archivo por otro diferente con una suma de verificación colisionante, entonces úselo
sha256sum
. La desventaja es que las funciones SHA son más lentas que MD5 .Progreso detallado en tiempo real
Finalmente, si desea ver el progreso en tiempo real, modifique la canalización para usar un archivo temporal para las sumas de verificación:
(Tenga en cuenta que mover el
sort
derecho despuésfind
no funcionaría, ya quexargs -P0
paralelizamd5sum
y los resultados pueden llegar fuera de orden)Esta versión del comando también le permite diferenciar los dos
/tmp/sums
archivos (asegúrese de cambiar el nombre del segundo si está en la misma máquina) y ver qué archivos difieren.fuente
En lugar de tener UN archivo enorme que contiene toda la información hash, estaba buscando una manera de hacer un archivo en cada carpeta de un árbol. Me inspiré en los comentarios aquí. El mío es un poco más complejo de lo que se publica aquí. Uso la rotación de archivos, pero este es el menos complejo para los nuevos jugadores. Esta versión tendrá que sobrescribir las sumas de cheques antiguas con las nuevas. Puede ser bueno mantener 2-3 versiones dependiendo de la frecuencia con la que lo ejecute y su necesidad de 'profundidad'.
Tenga en cuenta que mkshaindir, para mis propósitos, es un componente separado porque es posible que necesite crear un hash de archivos en una nueva carpeta, o de uno que se modificó recientemente. Todo esto se puede combinar en un script si es necesario.
El resto se deja como ejercicio para el lector.
fuente
basado en la respuesta anterior :
find ./path/to/directory -print0 | LC_ALL=C sort --zero-terminated | tar --create --no-recursion --null --files-from /dev/stdin --file /dev/stdout --verbose --numeric-owner | sha1sum
fuente
@allquixotic
La respuesta no genera los mismos hashes en diferentes máquinas que no nos ayudarán a verificar y tener hashes consistentes.La siguiente línea
find . -type f \( -exec md5sum "$PWD"/{} \; \)
devuelve el siguiente resultado:Por lo tanto, el camino sería diferente en diferentes máquinas.
awk '{print $1}'
nos ayudará a obtener la primera columna, que solo tiene el hash de los archivos. Más tarde, debemos ordenar esos hashes, donde el orden puede ser diferente en diferentes máquinas, lo que también puede hacer que tengamos diferentes hashes si hay más de dos archivos.Solución:
Para Mac:
Para Linux:
fuente