mac incremental rsync

incremental - rsync: diferencia entre--size-only y--ignore-times



rsync port (4)

Estoy tratando de entender cuál es la diferencia entre dos opciones

rsync --size-only

y

rsync --ignore-times

Tengo entendido que, de forma predeterminada, rsync comparará las marcas de tiempo y los tamaños de los archivos para decidir si un archivo se sincronizará o no. Las opciones anteriores permiten al usuario influir en este comportamiento.

Ambas opciones parecen, al menos verbalmente, dar como resultado lo mismo: comparar solo por tamaño .

¿Me estoy perdiendo algo sutil aquí?


En un sistema Scientific Linux 6.7, la página man en rsync dice:

--ignore-times don''t skip files that match size and time

Tengo dos archivos con contenido idéntico, pero con diferentes fechas de creación:

[root@windstorm ~]# ls -ls /tmp/master/usercron /tmp/new/usercron 4 -rwxrwx--- 1 root root 1595 Feb 15 03:45 /tmp/master/usercron 4 -rwxrwx--- 1 root root 1595 Feb 16 04:52 /tmp/new/usercron [root@windstorm ~]# diff /tmp/master/usercron /tmp/new/usercron [root@windstorm ~]# md5sum /tmp/master/usercron /tmp/new/usercron 368165347b09204ce25e2fa0f61f3bbd /tmp/master/usercron 368165347b09204ce25e2fa0f61f3bbd /tmp/new/usercron

Con --size-only , los dos archivos se consideran igual:

[root@windstorm ~]# rsync -v --size-only -n /tmp/new/usercron /tmp/master/usercron sent 29 bytes received 12 bytes 82.00 bytes/sec total size is 1595 speedup is 38.90 (DRY RUN)

Con --ignore-times , los dos archivos se consideran diferentes:

[root@windstorm ~]# rsync -v --ignore-times -n /tmp/new/usercron /tmp/master/usercron usercron sent 32 bytes received 15 bytes 94.00 bytes/sec total size is 1595 speedup is 33.94 (DRY RUN)

Así que no parece que --ignore-times tenga ningún efecto en absoluto.


Hay varias formas en que rsync compara archivos: la fuente autorizada es la descripción del algoritmo rsync: https://www.andrew.cmu.edu/course/15-749/READINGS/required/cas/tridgell96.pdf . El artículo de wikipedia sobre rsync también es muy bueno.

Para los archivos locales, rsync compara los metadatos y si parece que no necesita copiar el archivo porque el tamaño y la fecha y hora coinciden entre el origen y el destino, no busca más. Si no coinciden, cp es el archivo. Sin embargo, ¿qué sucede si los metadatos coinciden pero los archivos no son lo mismo? Entonces rsync probablemente no hizo lo que pretendía.

Los archivos que tienen el mismo tamaño pueden haber cambiado. Un ejemplo simple es un archivo de texto donde se corrige un error tipográfico, como cambiar "teh" por "the". El tamaño del archivo es el mismo, pero el archivo corregido tendrá una marca de tiempo más nueva. --size-only dice "no mires la hora; si el tamaño coincide, asume que los archivos coinciden", lo que sería una elección incorrecta en este caso.

Por otro lado, supongamos que accidentalmente hizo un gran "cp -r AB" ayer, pero olvidó conservar las marcas de tiempo, y ahora quiere hacer la operación en reversa "rsync BA". Todos los archivos que ha copiado tienen la marca de hora de ayer, a pesar de que no fueron realmente modificados ayer, y rsync terminará copiando todos esos archivos y actualizando la marca de tiempo también a ayer. --size-only puede ser tu amigo en este caso (módulo, el ejemplo anterior).

--ignore-times dice que compare los archivos independientemente de si los archivos tienen el mismo tiempo de modificación. Considere el ejemplo de error tipográfico anterior, pero luego no solo corrigió el error tipográfico sino que usó "tocar" para que el archivo corregido tenga el mismo tiempo de modificación que el archivo original; digamos que es astuto de esa manera. Bien, ignorar los tiempos hará una diferencia de los archivos a pesar de que el tamaño y el tiempo coinciden.


La respuesta corta es que --ignore-times hace más de lo que su nombre implica. Ignora tanto el tiempo como el tamaño. Por el contrario, --size-only hace exactamente lo que dice.

La respuesta larga es que rsync tiene tres formas de decidir si un archivo está desactualizado:

  1. Compare el tamaño de la fuente y el destino.
  2. Compare la marca de tiempo de origen y destino.
  3. Compare la suma de comprobación estática de origen y destino.

Estas comprobaciones se realizan antes de transferir datos. Notablemente, esto significa que la suma de comprobación estática es distinta de la suma de comprobación de la secuencia - la última se calcula al transferir datos.

De forma predeterminada, rsync usa 1 y 2. Tanto 1 como 2 se pueden adquirir juntos por una sola stat , mientras que 3 requiere leer todo el archivo (esto es independiente de leer el archivo para transferir). Suponiendo que solo se especifica un modificador, eso significa lo siguiente:

  • Al usar --size-only , solo se realiza 1 - timestamps y checksum se ignoran. Se copia un archivo a menos que su tamaño sea idéntico en ambos extremos.

  • Al usar --ignore-times , no se realiza ninguna de 1, 2 o 3. Un archivo siempre se copia.

  • Al usar --checksum , se usa 3 además de 1 pero no se realiza 2. Se copia un archivo a menos que el tamaño y la suma de comprobación coincidan. La suma de comprobación solo se calcula si el tamaño coincide.


Te falta que rsync también pueda comparar archivos por suma de comprobación.

--size-only significa que rsync omitirá los archivos que coincidan en tamaño, incluso si las marcas de tiempo difieren. Esto significa que sincronizará menos archivos que el comportamiento predeterminado. Extrañará cualquier archivo con cambios que no afecten al tamaño general del archivo. Si tiene algo que cambia las fechas en los archivos sin cambiar los archivos, y no quiere que rsync dedique mucho tiempo a verificar esos archivos para descubrir que no han cambiado, esta es la opción que debe usar.

--ignore-times significa que rsync hará una suma de comprobación de cada archivo, incluso si coinciden las marcas de tiempo y los tamaños de archivo. Esto significa que sincronizará más archivos que el comportamiento predeterminado. Incluirá cambios en los archivos, incluso cuando el tamaño del archivo sea el mismo y la fecha / hora de modificación se haya restablecido al valor original (es poco probable que se restablezca la fecha / hora en la práctica, pero podría suceder). Verificar todos los archivos significa que debe leerse por completo desde el disco, lo que puede ser lento.