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

114

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 el tamaño de los archivos para decidir si un archivo debe sincronizarse 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í?

alfred_j_kwack
fuente
18
Esto probablemente encajaría mejor en algo como SuperUser.com o Unix.SE , ya que se trata de usar una herramienta existente (no relacionada con la programación) en lugar de algo directamente relacionado con la escritura de código.
Jerry Coffin

Respuestas:

110

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 metadatos y, si parece que no necesita copiar el archivo porque el tamaño y la marca de tiempo coinciden entre el origen y el destino, no busca más. Si no coinciden, es cp el archivo. Sin embargo, ¿qué sucede si los metadatos coinciden pero los archivos no son realmente iguales? Entonces, rsync probablemente no hizo lo que pretendías.

Es posible que los archivos del mismo tamaño hayan cambiado. Un ejemplo sencillo es un archivo de texto en el que 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 reciente. --size-onlydice "no mire la hora; si el tamaño coincide, suponga que los archivos coinciden", lo que sería una elección incorrecta en este caso.

Por otro lado, suponga que accidentalmente hizo un gran cp -r A Bayer, pero olvidó conservar las marcas de tiempo y ahora desea realizar la operación a la inversa rsync B A. Todos esos archivos que cp'ed tienen la marca de tiempo de ayer, a pesar de que en realidad no fueron modificados ayer, y rsync terminará por defecto copiando todos esos archivos y actualizando la marca de tiempo a ayer también. --size-onlypuede ser su amigo en este caso (módulo el ejemplo anterior).

--ignore-timesdice comparar los archivos independientemente de si los archivos tienen el mismo tiempo de modificación. Considere el ejemplo de error tipográfico anterior, pero no solo corrigió el error tipográfico, sino que solía touchhacer que el archivo corregido tenga el mismo tiempo de modificación que el archivo original; digamos que es astuto de esa manera. Bueno --ignore-times, hará una diferencia de los archivos aunque el tamaño y el tiempo coincidan.

ckg
fuente
58

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


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

  1. Compare el tamaño de origen y 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 verificaciones se realizan antes de transferir datos. En particular, esto significa que la suma de comprobación estática es distinta de la suma de comprobación del flujo: la última se calcula mientras se transfieren los datos.

De forma predeterminada, rsyncusa solo 1 y 2. Tanto 1 como 2 pueden ser adquiridos juntos por un solo stat, mientras que 3 requiere leer el archivo completo (esto es independiente de leer el archivo para transferirlo). Suponiendo que solo se especifica un modificador, eso significa lo siguiente:

  • Al usar --size-only, solo se realiza 1: las marcas de tiempo y la suma de comprobación 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 ni 1, 2 ni 3. Siempre se copia un archivo.

  • 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.

MisterMiyagi
fuente
1
--checksum es exactamente lo que estaba buscando. Estaba copiando la salida de la compilación que solo tenía el cambio de hora para la mayoría de los archivos. Agregar --checksum significaba que ignoraba las diferencias de tiempo, pero se aseguraba de que fueran idénticas bit por bit. Era lo que esperaba, ignorar veces hacerlo, gracias por la información adicional.
Joseph Connolly
50

Le falta que rsync también puede comparar archivos por suma de comprobación.

--size-onlysignifica 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. Perderá 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 sumar esos archivos para descubrir que no han cambiado, esta es la opción que debe usar.

--ignore-timessignifica que rsync sumará cada archivo, incluso si las marcas de tiempo y los tamaños de archivo coinciden. 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. La suma de verificación de cada archivo significa que debe leerse por completo desde el disco, lo que puede ser lento. Algunas canalizaciones de compilación restablecerán las marcas de tiempo a una fecha específica (como 1970-01-01) para garantizar que el archivo de compilación final sea reproducible bit a bit, por ejemplo, cuando se empaqueta en un archivo tar que guarda las marcas de tiempo.

rjmunro
fuente
4
"Es poco probable que se restablezca la fecha / hora en la práctica, pero podría suceder" - Por ejemplo, cuando se utiliza software que, en nombre de compilaciones reproducibles, restablece a la fuerza todos los archivos a 1970-01-01 en lugar de la fecha y hora de la creación / modificación real.
10
En realidad, creo que necesita la opción -c si desea que se utilicen sumas de comprobación. Sin él, --ignore-times copiará todos los archivos incondicionalmente.
Edward Falk
1
La opción -a puede anular estas opciones. En mi caso, estaba usando --compare-dir = y --size-only y obtenía resultados inesperados. Cambiar -a -r resolvió el problema.
dbagnara
@dbagnara He confirmado hoy que --size-only "se encuentra encima de" -a, o "anula" -a. Tenía una unidad que, por alguna razón, montada con todos los tiempos de modificación aumentaba en un mes. Rsync to backup estaba copiando cada archivo (con -a ON). Agregar --size-only solucionó el problema y condujo a los resultados deseados (por lo tanto, -a --size-only). Así que llego a la conclusión de que solo el tamaño anula el archivo.
Tommy
1

En un sistema Scientific Linux 6.7, la página de manual de 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 iguales:

[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-timestenga ningún efecto.

Peter Chiu
fuente
2
--ignore-timeshabría copiado los archivos incluso si sus marcas de tiempo fueran las mismas.
MisterMiyagi