¿Rsync es la forma más rápida y confiable de verificar si los directorys son idénticos?

El problema es: copié una carpeta de 340 GB y quería verificar si la copy fue exitosa. La copy se realizó usando rsync -aP /origin /dest desde una partición ext4 a otra partición ext4.

Sé que usar diff -r /origin /dest para comparar los directorys de origen y destino tomaría un time muy (muy, muy) largo. Entonces pensé que podría usar rsync -aP --dry-run /origin /dest para comparar los directorys … Y me llevó 5 segundos (!). (Utilicé el time antes del command para medirlo).

Como rsync -aP solo mostraba el post "enviar list de files incremental" , y nada más (enumeraba files o files diferentes que no se copyron), llegué a la conclusión de que es la forma más rápida y confiable de verificar si dos directorys son idéntico. (Siempre que se use la opción rsync -a , los files y directorys también son idénticos en términos de propietario, permissions y time de modificación … -P implica --progress ).

¿Estoy en lo cierto? ¿Es rsync -aP --dry-run /origin /dest la manera más rápida y confiable de verificar si los directorys son idénticos?

Si usa diff, siempre lee el contenido del file para detectar cualquier diferencia entre sus contenidos.

Rsync, de forma pnetworkingeterminada, no leerá el contenido de los files si el nombre de file, la hora de modificación y el tamaño del file entre los dos son los mismos. Si estos son iguales, asume que el contenido del file es el mismo y no se molesta en leerlos. Esto lo hará órdenes de magnitud más rápido en directorys que ya son iguales (o casi lo mismo).

En la mayoría de los casos, este comportamiento no es un problema, ya que sería muy raro que un file haya cambiado tanto antes como después de la synchronization, tanto dentro de la misma window de 1 segundo para tener el mismo time de modificación, y mantenga el mismo file tamaño. E incluso si eso sucediera, sería raro que eso importara mucho.

Puede obligar a rsync a leer siempre el contenido del file independientemente del time de modificación (o tamaño) mediante la opción de la command-line --ignore-times .

La velocidad y la confiabilidad son a menudo requisitos opuestos. diff (o cmp ) compararía los files bit por bit, lo que daría la respuesta más confiable . (Use diff -q si solo quiere saber si los files son los mismos).

Para que sea más rápido, debe omitir leer los files en su totalidad y contar con las marcas de time; u omita los datos transferidos, lo que probablemente no sea un gran problema dentro de un sistema ya que la E / S de disco probablemente sea el factor que limita la velocidad.

Si los files estaban en sistemas diferentes, y tienes md5sum o similar, podrías hacer algo como

 cd /somewhere ; find . -type f | xargs -d '\n' md5sum > /tmp/checksums 

en ambos extremos y luego compara los files de salida. De esa forma solo necesitarías transferir los hashes, no la información completa. (o sha512sum si quieres un cheque más fuerte). rsync -c también aparentemente usa MD5 internamente .


La elección entre simplemente verificar las marcas de time y leer toda la información también depende de la fuente de error asumida. La comprobación de los metadatos indicará si el process de copy terminó antes de copyr todo, pero no comprobará los datos reales copydos. Para detectar daños en los datos silenciosos, los datos deberían leerse completamente y comparar los datos completos o solo las sums de comprobación. Con rsync, rsync -i -c generará una list de files cuyas sums de comprobación no coinciden y las copyrá de nuevo.