
Considere este caso de prueba:
mkdir a
echo 'blah' > a/test
mkdir b
echo 'blah' > b/test
rsync -r --link-dest=/tmp/b /tmp/a/ /tmp/c
Como era de esperar, rsync crea c/test
un vínculo físico de b/test
(tenga en cuenta el recuento de 2
):
# ls -l c/test
-rw-r--r-- 2 root root 16 Jan 6 19:43 test
Ahora mira esto:
rm -r c # start over
touch b/test
rsync -r --link-dest=/tmp/b /tmp/a/ /tmp/c
El vínculo físico no se crea:
# ls -l c/test
-rw-r--r-- 1 root root 16 Jan 6 19:50 test
Elpáginas de manualdice (el énfasis es mío):
Los archivos deben ser idénticos en todosPreservadoatributos (por ejemplo, permisos, posiblemente propiedad) para que los archivos se vinculen entre sí.
Sin embargo, creo que por defecto el tiempo del archivo no esPreservadoy, por tanto, no debería suponer ninguna diferencia en este caso.
¿Lo que está sucediendo? ¿Es esto un error? ¿Qué puedo hacer?
Mi objetivo es ahorrar espacio en un servidor de integración continua que aloja muchas ramas de un repositorio vinculando todos los archivos idénticos. Entonces mi comando real es:
rsync -r --link-dest=/ci/master /ci-runner/build/ /ci/branch-123
.
Esto significa que no me importan los tiempos, así que pensé en touch
enviarlos todos al tiempo actual antes del rsync
pero sería una solución algo burda y además el toque no parece funcionar de forma recursiva.
Respuesta1
Estás viendo los resultados del algoritmo de "verificación rápida" de rsync que decide transferir archivos según su tamaño y su marca de tiempo. Como se detalla en man rsync
:
Rsync encuentra archivos que deben transferirse mediante un algoritmo de "verificación rápida" (de forma predeterminada) que busca archivos que han cambiado de tamaño o en la hora de la última modificación. Cualquier cambio en los demás atributos conservados (según lo solicitado por las opciones) se realiza directamente en el archivo de destino cuando la verificación rápida indica que no es necesario actualizar los datos del archivo.
Tienes opciones:
Si desea que se ignore la marca de tiempo y se transfieran archivos basándose solo en el tamaño modificado, puede usar la
--size-only
opción.Tenga en cuenta que esto significa que
rsync
no se transferirá un archivo modificado si el cambio simplemente deja el archivo con el mismo tamaño.Si, en cambio, desea
rsync
comprobar si el contenido de los archivos es realmente idéntico, utilice--checksum
. Esto puede provocar una desaceleración sustancial.
El algoritmo de "verificación rápida" es el predeterminado porque generalmente es un buen equilibrio entre velocidad y precisión.