¿Hay MD5 (o similar) a una carpeta? ¿Cómo verificar si dos carpetas son iguales?

10

Me gustaría encontrar un md5sum(o cálculo similar) de una carpeta sin comprimirlo en un archivo.

Por ejemplo, si en la carpeta MyFolderque tenemos los archivos 1.txt, 2.txty 3.txt, que contiene:


1.txt

El texto en 1.txt

2.txt

El texto en 2.txt

3.txt

El texto en 3.txt


¿Cómo puedo calcular el total md5sumde esto MyFolder? ¿Hay alguna manera? Quiero usar esto para verificar si dos carpetas tienen el mismo contenido.

Esto puede ser útil para verificar si dos CD o carpetas son iguales. Me gustaría una manera fácil de hacerlo.

GarouDan
fuente

Respuestas:

15

La herramienta md5deep fue desarrollada precisamente para este propósito. Muchas distribuciones de Linux lo ofrecen en forma de paquete.

David Schwartz
fuente
1
¡Gracias! Me ha funcionado bien. A otros usuarios con el mismo problema les gusta esto: sudo apt-get install md5deep md5deep -rel /path/to/your/directory/ > directory_hash.md5 md5deep -X directory_hash.md5 -r /path/to/your/second/direcotory muchas gracias.
GarouDan
@GarouDan. El comando que ha mostrado seguirá enlaces simbólicos. Puede usar la -oopción para manejar los tipos de archivos.
Peter.O
Oh, gracias ... no sé eso ... realmente útil. ¡Lo recordare!
GarouDan
4

Si no desea archivarlo, tal vez podría hacer algo como esto

diff <(find folder1) <(find folder2)

Puede que tenga que adaptar los findcomandos para ser más precisos.

EDITAR Puede agregar -execa su llamada de búsqueda para comparar el contenido de los archivos. Algo similar a esto:

diff <(find folder1 -type f -exec md5sum {} \; | sort) <(find folder2 -type f -exec md5sum {} \; | sort)

Recuerde que es posible que desee adaptar esto.

rahmu
fuente
Es un punto interesante. Esto enumera todos los archivos de cada carpeta ... pero si tengo una gran cantidad de archivos ... ¿cómo podría verificar que haya los mismos archivos (con los datos, tal vez usando una herramienta md5sum) en cada carpeta?
GarouDan
1
Luego haga una diferencia de la salida MD5SUM de cada archivo. Solo necesita unir los comandos find, md5sum y diff de manera diferente.
sybreon
Gracias por tus ideas también, cya ... Intentaré cosas interesantes con estos hallazgos y luego ... gracias.
GarouDan
3

Una forma de probar podría ser generar una suma md5 basada en la concatenación de todos los archivos de la carpeta y sus subcarpetas. Tenga en cuenta que esto también requiere que los archivos tengan los mismos nombres (ya que deben estar en el mismo orden de clasificación). El siguiente código debería funcionar:

#!/bin/bash

shopt -s nullglob
shopt -s globstar || { printf '%s\n' 'Bash 4 is required for globstar.' ; exit 1 ; }
(( $# == 2 )) || { printf '%s\n' "Usage: ${0##*/} olddir newdir" ; exit 2 ; }

for _file in "$1"/**/*; do [[ -f ${_file} && ! -L ${_file} ]] && _files_in_old_dir+=( "${_file}" ); done
for _file in "$2"/**/*; do [[ -f ${_file} && ! -L ${_file} ]] && _files_in_new_dir+=( "${_file}" ); done

(( ${#_files_in_old_dir[@]} )) || { printf '%s\n' 'No files in old dir.' ; exit 3 ; }
(( ${#_files_in_new_dir[@]} )) || { printf '%s\n' 'No files in new dir.' ; exit 4 ; }

_md5_old_dir=$(cat "${_files_in_old_dir[@]}" | md5sum)
_md5_new_dir=$(cat "${_files_in_new_dir[@]}" | md5sum)

{ [[ ${_md5_old_dir} == "${_md5_new_dir}" ]] && (( ${#_files_in_old_dir[@]} == ${#_files_in_new_dir[@]} )) ; } && printf '%s\n' 'Folders are identical.' || { printf '%s\n' 'Folders are not identical.' ; exit 3 ; }

Si realmente le importan los nombres de los archivos, etc., podría usar un bucle para comparar lo que está en ${_files_in_old_dir}y ${_files_in_new_dir}. Esto debería funcionar para la mayoría de los casos (al menos verifica el número de archivos en el directorio y sus subdirectorios).

Chris Down
fuente
Este es un buen script ... gracias @Chris. Pero tiene un problema ... el uso de cat , las subcarpetas se bloquea con errores ... ¿Tienes una idea para resolverlo? Muchas gracias.
GarouDan
Funciona bien para mí. Asegúrate de que tu caparazón sea compatible globstar. Cual es el error
Chris Down
1
"Funciona" (+1) ... pero globstar en bash 4 sigue los enlaces simbólicos del directorio , pero eso es solo un problema si cualquiera de los directorios contiene un enlace simbólico.
Peter.O
@ Buena llamada, agregué en una prueba.
Chris Down
0

Noté que la publicación original es bastante antigua, sin embargo, creo que esta información aún puede ser valiosa para aquellos que buscan una solución para verificar que los archivos se copien correctamente. Rsync podría ser el mejor método para copiar datos y las respuestas dadas en este hilo son buenas, sin embargo, para aquellos que no tienen experiencia con Linux, intentaré dar una explicación más detallada.

Escenario: acaba de copiar datos de un disco a otro, con muchos subdirectorios y archivos. Desea verificar que todos los datos se copien correctamente.

Primero verifique que md5deep esté instalado emitiendo el comando md5deep -v.

Si recibe un mensaje que dice algo como 'comando no encontrado', instale md5deep por apt-get install md5deep.

Se asume que solo desea tratar con archivos normales. Si desea tratar con otros tipos de archivos, consulte el indicador -o en el manual md5deep. ( man md5deep)

Ahora puede continuar, y suponemos que copió archivos de /mnt/orginala /mnt/backup, sustituya estos por cualquier directorio que esté utilizando.

Primero cambie al directorio de origen, esta es la fuente original de los archivos que copió o realizó una copia de seguridad:

cd /mnt/orginal

Luego haga una suma de verificación de cada archivo:

md5deep -rel -o f . >> /tmp/checksums.md5

Este comando explicó:

-r habilita el modo recursivo

-e muestra el indicador de progreso

-l habilita rutas de archivos relativas.

-o f solo funciona en archivos normales (no en dispositivos de bloque, tuberías con nombre, etc.)

. le dice a md5deep que comience en el directorio actual.

>> /tmp/checksums.md5le dice a md5deep que redirija toda la salida a /tmp/checksums.md5.

Tenga en cuenta que si desea sobrescribir contenido en versiones anteriores de /tmp/checksums.md5, use >y no>>

Tenga en cuenta que este comando puede tardar bastante, dependiendo de la velocidad io y el tamaño de los datos. Podría experimentar con nice y / o ionice para aumentar el rendimiento de md5deep, pero eso está fuera del alcance de esta respuesta.

Cuando finaliza la creación de las sumas de verificación, ahora tiene un archivo que tiene entradas similares a:

69c0a826b29c8f40b7ca5e56e53d7f83 ./oldconfig-11-09-2013/etc2/apm/event.d/20hdparm 651f3c7f79a14332f9fa7bb368039210 ./oldconfig-11-09-2013/etc2/apm/event.d/anacron 50d89784c1e201f68ff978b95ff4bdfb ./oldconfig-11-09-2013 /etc2/apm/scripts.d/alsa e9b9131660a8013983bc5e19d7d669eb ./oldconfig-11-09-2013/etc2/ld.so.cache

La primera columna es la suma de verificación md5, y la segunda columna es la ruta relativa al archivo al que pertenece la suma de verificación.

Si desea ver cuántos archivos existen en el archivo de suma de verificación, emita el comando:

wc /tmp/checksums.md5 -l

Ahora, desea verificar que los datos copiados sean correctos:

cd /mnt/backup

md5deep -o f -reX /tmp/checksums.md5 . >> /tmp/compare.result

La única diferencia con respecto a cuando creamos las sumas de verificación es -X, que muestra el hash actual de un archivo si la entrada en el archivo checksums.md5 no coincide. Entonces, al final de la prueba, si /tmp/compare.resultestá en blanco, puede confiar en que todos los archivos se copian correctamente ya que las sumas de verificación coinciden.

Tenga en cuenta que solo los archivos enumerados en el /tmp/checksums.md5archivo serán verificados para una suma de verificación correcta, si hay archivos adicionales en el /mnt/backupdirectorio, md5deep no le notificará sobre estos.

Notas:

  • No necesariamente tiene que usar la redirección para almacenar archivos de salida. Consulte el manual de md5deep para obtener más información.

  • Es posible que deba ejecutar los comandos md5deep como root, según los permisos de los archivos que maneja.

NordicViking
fuente
0

Si desea verificar de forma recursiva las diferencias entre dos directorios /path1y /path2 sin usar md5deep:

diff <(cd /path1 && find . -type f |xargs md5) <(cd /path2 && find . -type f |xargs md5)

Explicación:

  • se metió path1para hacer que todas las líneas impresas findsean relativas a path1( cd /path1)
  • enumera todos los archivos de forma recursiva en la ruta actual ( && find . -type f)
  • use cada salida de línea findcomo entrada para md5( | xargs md5)

El resultado se verá así si hay alguna diferencia:

< MD5 (./index.html) = 36b01762f0329b2c12a5186520c7d78a
< MD5 (./inline.js) = ce99823a4b2c24839a727c5781f59a36
< MD5 (./main.js) = 3a597404d3ba7f0a6e3cb093ef57ebb2
---
> MD5 (./index.html) = 3a3d7663a7b2871ff37b9081a53593f9
> MD5 (./inline.js) = 1bbd0ecfc75b578413105c6b9009f9b3
> MD5 (./main.js) = 0f44abe5084add3cabdc39feec0c699878c78
david_p
fuente