Comparar directorys masivos con informes de progreso

Simplemente sincronicé 2,000,000 de files (3TB) de un RAID a otro.

Quiero asegurarme de que mi información esté intacta.

rsync -c lleva mucho time.

diff no me muestra lo que está haciendo.

¿Hay una alternativa que sea (a) más rápida y (b) me muestre el progreso mientras se compara?

(Estoy en Mac, y brew search diff me da apgdiff colordiff diffstat diffutils fmdiff libxdiff open-vcdiff podiff rfcdiff vbindiff bsdiff diffpdf diffuse dwdiff kdiff3 ndiff perceptualdiff rdiff-backup tkdiff wdiff … ¿alguno de ellos haría el trabajo?)

edición para corrección y claridad de opciones – Olvidé '–brief'

 diff -rs --brief "$dir1" "$dir2" -r, --recursive recursively compare any subdirectories found -s, --report-identical-files report when two files are the same -q, --brief report only when files differ --speed-large-files assume large files and many scattenetworking small changes 

y agregue otras opciones para probar, dependiendo de lo que esté comparando:

 -i, --ignore-case ignore case differences in file contents -b, --ignore-space-change ignore changes in the amount of white space -B, --ignore-blank-lines ignore changes whose lines are all blank --strip-trailing-cr strip trailing carriage return on input --ignore-file-name-case ignore case when comparing file names 

diff -rs leerá cada byte del original y la copy e informará los files que son iguales.

El formatting de salida diff está definido por POSIX, por lo que es bastante portátil. Es posible que desee agregar algo como:

| tee diff-out.1 | grep -v -Ee 'Files. * y. * son idénticos'

Puede usar chksums o hashes, pero luego debe mantenerlos sincronizados con los treees de files, por lo que volvería a leer cada byte de cada file de todos modos.

EDITAR – demasiado time para ser un comentario, en respuesta a:

los files de más de 10 GB no están verificando

Es posible que desee probar esta opción diff: –speed-large-files

Es posible que el diff que está usando no esté funcionando bien con files muy grandes (más grande que la memory del sistema, por ejemplo), y por lo tanto informa las diferencias entre los files que son realmente iguales.

Pensé que había una opción -h o una 'bdiff' que funcionaba mejor en files grandes, pero no puedo encontrar uno en Fedora. Creo que las opciones –speed-large-files es un sucesor de una opción '-h' "half-hearted compare".

Un enfoque diferente sería repetir el command rsync que usaste, con '-vin' (verbose, itemize, no_run). Esto reportaría cualquier diferencia que encuentre rsync, y no debería haber ninguna.

Para mover algunos files, estás viendo un script algo como:

 if [ cmp -s "$dir1/$path" "$dir2/$path" ] ; then target="$dir2/verified/$path" mkdir -p $(basename "$target") mv "$dir2/$path" "$target" fi 

pero no recomiendo hacer eso. La pregunta subyacente es "¿cómo puedo estar seguro de que rsync copió correctamente una jerarquía de files?" y si puede demostrarse a sí mismo que rsync está funcionando bien, con diff o alguna otra herramienta, entonces puede simplemente confiar en rsync, en lugar de evitarlo.

rsync -vin se comparará en function de cualquier otra opción que le des. Pensé que no cumplía con la sum de comprobación, pero tienes razón, se requiere -c o –checksum para eso.

La utilidad diff se destina realmente a files de líneas de text, pero debe informar 'idénticos' bajo -s para files binarys.

El –brief debería suprimir cualquier salida de contenido de file – mis disculpas por pasarlo por alto antes – estaba medio enterrado en un feo guión.

Me gustaría utilizar algún tipo de aplicación hash para verificar la integridad de los datos. Sé que muchas utilidades de búsqueda de files duplicates usan hashes para identificar duplicates / no duplicates. Me parece que esta es una investigación que podría valer la pena.

Puede usar rdiff-backup para eso. Instálalo en ambos serveres y hará comparaciones inteligentes de las sums de comprobación y sincronizará lo que todavía no existe.

Aquí está la diff con el informe de progreso:

 diff -rqs dir1 dir2 | pv -l -s filecount > logfile 

Necesitará pv (pipe viewer): http://www.ivarch.com/programs/pv.shtml

Explicación:

  • diff -r compara directory y subdirectorys recursivamente.
  • diff -q print solo difieren los nombres de file de los files. no imprima las diferencias reales.
  • diff -s también imprime nombres de file de files que no difieren. esto es importante para la información de progreso.
  • pv -l informe el progreso basado en el recuento de líneas.
  • pv -s count time estimado para completar en base al recuento.
  • La networkingirección a logfile de logfile es para una salida bonita. De lo contrario, la salida de diff se mezclará con la línea de estado de pv .

para get el conteo de files use el siguiente command:

 find dir1 -type f | wc -l 

Filtra el file de logging para files que son diferentes:

 grep -v "^Files .* identical$" logfile 

Esta variación imprimirá los files que son diferentes en time real mientras también registra todo en el logfile de logfile :

 diff -rqs dir1 dir2 | pv -l -s filecount | tee logfile | grep -v "^Files .* identical$" 

Alternativamente, puede registrar solo los files que son diferentes:

 diff -rqs dir1 dir2 | pv -l -s filecount | grep -v "^Files .* identical$" > logfile 

Nota: los commands anteriores informarán el progreso según el conteo de files. Esto funciona mejor si hay muchos files pequeños. Si tiene algunos files grandes, entonces no se divertirá mucho con esto.

Lamentablemente, no conozco una forma de informar el progreso en function de los bytes comparados.


Si puede encontrar paz simplemente comparando los metadatos (y no el contenido real de los files), entonces puede usar rsync. Esto será considerablemente más rápido.

Para más detalles:

  • Compara directorys pero no contenido de files
  • ¿Estimar el time o el trabajo que queda para terminar para rsync?