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í?
Respuestas:
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-only
dice "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 B
ayer, pero olvidó conservar las marcas de tiempo y ahora desea realizar la operación a la inversarsync 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-only
puede ser su amigo en este caso (módulo el ejemplo anterior).--ignore-times
dice 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íatouch
hacer 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.fuente
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: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,
rsync
usa solo 1 y 2. Tanto 1 como 2 pueden ser adquiridos juntos por un solostat
, 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.fuente
Le falta que rsync también puede 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. 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-times
significa 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.fuente
En un sistema Scientific Linux 6.7, la página de manual de rsync dice:
Tengo dos archivos con contenido idéntico, pero con diferentes fechas de creación:
Con
--size-only
, los dos archivos se consideran iguales:Con
--ignore-times
, los dos archivos se consideran diferentes:Así que no parece que
--ignore-times
tenga ningún efecto.fuente
--ignore-times
habría copiado los archivos incluso si sus marcas de tiempo fueran las mismas.