¿Cómo puedo confirmar fácilmente en Linux que dos directorios separados tienen exactamente el mismo contenido?

8

CentOS 5.x

La pregunta de Mq parecía similar a esta, pero no estaba segura ...

Tengo dos servidores (completamente aislados entre sí), cada uno con un directorio y subdirectorios que deben tener el mismo contenido exacto.

Por ejemplo, el diseño del directorio podría ser algo como:

SERVIDOR A -

/opt/foo/foob/1092380298309128301283/123.txt
/opt/foo/foob/5094380298309128301283/456.txt
/opt/foo/foob/5092380298309128301283/789.txt
/opt/foo/foob/1592380298309128301283/abc.txt

SERVIDOR B -

/opt/foo/foob/1092380298309128301283/123.txt
/opt/foo/foob/5094380298309128301283/456.txt
/opt/foo/foob/5092380298309128301283/789.txt
/opt/foo/foob/1592380298309128301283/abc.txt

Idealmente, me gustaría una forma de hacer una verificación recursiva y hacer que algo confirme que todo coincide.

También quiero evitar el uso de herramientas de terceros.

¿Algunas ideas?

Mike B
fuente
¿Solo desea comparar los dos directorios, o realmente hacer que uno sea un duplicado del otro?
Scott Pack
@ScottPack Gran pregunta. Quiero comparar pero NO hacer ningún cambio. Algo más está manejando la replicación de los directorios. Solo quiero asegurarme de que esté haciendo su trabajo.
Mike B
1
¿Ya etiquetaste esta pregunta rsync? Entonces ... uhm, ¿usar rsync(con -nopción)?
falsificador
@faker Pensé que rsync podría ser la opción, pero no estaba seguro de si había algo mejor, más fácil o más específico para este caso de uso. Necesito saber que los nombres de archivo, la fecha, el tamaño y la ubicación relativa coinciden.
Mike B
tenga en cuenta que rsync no verifica el contenido del archivo si el tiempo y el tamaño coinciden, vea la opción --checksum si esto le preocupa
guíe

Respuestas:

9

Una buena manera es usar md5sums en cada archivo del árbol:

Ejecute esto en el servidor1:

find /opt/foo/foob/ -type f -print0 | xargs -0 md5sum > report_from_server1.tx

Ejecute esto en el servidor2

find /opt/foo/foob/ -type f -print0 | xargs -0 md5sum > report_from_server2.tx

Luego solo compara los dos archivos (usando diff) o lo que quieras.

¿Es eso lo que estás buscando?

Por supuesto, puede usar SSH para ejecutar el comando de forma remota si lo desea.

Camden S.
fuente
Gracias Camden Sí, creo que esto es lo que estaba buscando. Lo probaré y veré si funciona.
Mike B
2
O md5sum the md5sums
dmourati
Excelente: correcto, si no le importa saber qué archivos cambian, podría simplemente md5sum los archivos resultantes y comparar esas dos sumas.
Camden S.
Además, probablemente ya lo sepas, pero para ejecutar ese comando de forma remota a través de SSH, simplemente lo haríasssh user@servera 'find /opt/foo/foob/ -type f -print0 | xargs -0 md5sum'
Camden S.
1
MikeB, al ejecutar una lista larga recursiva y pasarla a md5sum, obtendrás una md5sum de la lista del directorio, que excluirá el contenido de los archivos. Si los tamaños de los inodos en los sistemas de archivos en cualquier extremo fueran diferentes, también podría crear una diferencia en los tamaños de los archivos. Haciendo un md5sum en el contenido como originalmente sugerido por @CamdenS. es mejor.
casi
7

Si no necesariamente te importa lo que cambió, solo que algo ha cambiado, rsync sigue siendo realmente bueno para eso. Intente ejecutar este comando y eche un vistazo a la salida, suponiendo que esto se ejecute desde 'servera'.

rsync -avcn /opt/foo/ serverb:/opt/foo

La lista resultante será aquellos archivos que se habrían modificado si realmente hubiera ejecutado el proceso de sincronización. Teniendo en cuenta que los archivos aparecerán en la lista incluso si solo se modificó la marca de tiempo, pero el contenido se mantuvo igual. Como agregamos el -nindicador, no se realizarán acciones, solo se informarán.

Scott Pack
fuente
Gracias. ¿Qué pasa si las dos cajas están completamente aisladas una de la otra? ¿Cómo puedo usar la salida para comparar?
Mike B
rsync no admite que tanto el origen como el destino sean remotos, por lo que deberá ejecutarlo en uno de sus servidores
falsificador
@faker: Tengo que admitirlo, nunca lo he intentado antes, es bueno saberlo. Sin embargo, como usted dice, es bastante fácil de explicar.
Scott Pack
+1. Uso inteligente de rsync. Para ser completamente correcto, sin embargo, debe ejecutar el rsyncen ambas direcciones. Es decir, debe agregar esto:rsync -avcn serverb:/opt/foo/ /opt/foo
Steven lunes
5

Si bien podría hackear un script rápido que calculará hashes MD5 individuales para archivos individuales en un directorio, la mejor manera de hacerlo sería usar una herramienta llamada md5deepque calculará recursivamente los hashes de todos los archivos en un directorio y luego generará ellos a un archivo. Luego se puede usar en otro directorio, tomando el primer archivo hash como entrada y proporcionándole una lista de archivos que son diferentes entre los dos directorios.

Entonces, tomando su ejemplo, seguiría este proceso:

  1. Calcule los hashes del directorio requerido en el Servidor A:

    md5deep -r /opt/foo/ > file_hashes.txt

  2. Copie el archivo file_hashes.txten el Servidor B para comparar.

  3. Calcule los hashes del directorio requerido en el Servidor B, pero tome los hashes del archivo del Servidor A como un archivo de entrada utilizando el -xindicador para mostrar solo los archivos que son diferentes:

    md5deep -x file_hashes.txt -r /opt/foo/

El conjunto de herramientas md5deep forma parte del sistema de gestión de paquetes de la mayoría de las distribuciones, y lo mejor es que admite varios algoritmos de hashing diferentes, no solo MD5. Entonces, si eres paranoico sobre las colisiones, tienes varias alternativas disponibles. Las siguientes herramientas forman parte de md5deep, y cada una proporciona un algoritmo de hash alternativo:

   md5deep - Compute and compare MD5 message digests
   sha1deep - Compute and compare SHA-1 message digests
   sha256deep - Compute and compare SHA-256 message digests
   tigerdeep - Compute and compare Tiger message digests
   whirlpooldeep - Compute and compare Whirlpool message digests
Richard Keller
fuente
0

Utilicé una técnica similar a @ scott-pack. Esto le dará una diferencia bidireccional. Todo lo que comienza con "eliminar" es un archivo que está en el servidor remoto pero no en el servidor local. Cada directorio listado sin ningún contenido de archivo es uno que no tiene cambios. Cada archivo que aparece en la lista es un archivo que no existe en el servidor remoto o que la versión local es "más nueva".

rsync -rvnac --delete /local/directory/ user@remote:/remote/directory/
David Baucum
fuente