
Estoy usando rsync para copiar archivos de Linux a Mac a través de SSH.
Mi comando se ve así:
rsync \
--exclude FOO \
--exclude BAR \
-e ssh \
-rclpvih \
--delete \
--stats \
/local/dir/ \
host:/remote/dir/
Y el resultado se ve así:
building file list ... done
...
<fc.T...... core/FileRecordingProcessor.cpp
<fc.T...... core/Pipeline.hpp
...
Number of files: 4,910 (reg: 4,401, dir: 509)
Number of created files: 0
Number of regular files transferred: 35
Total file size: 332.34M bytes
Total transferred file size: 2.62M bytes
Literal data: 0 bytes
Matched data: 2.62M bytes
File list size: 196.59K
File list generation time: 0.457 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 209.72K
Total bytes received: 12.03K
sent 209.72K bytes received 12.03K bytes 147.83K bytes/sec
total size is 332.34M speedup is 1,498.70
Incluso si nada cambió localmente, rsync transfiere el mismo (sub)conjunto de archivos en cada invocación.
Esos archivos son sólo un pequeño subconjunto de todo el árbol. Otros archivos no se reenvían a menos que realmente se modifiquen. El número de archivos que se reenvían es siempre 35. Todos ellos tienen <fc.T......
banderas.
Los archivos se ven idénticos en máquinas locales y remotas.
Local:
$ ll core/Pipeline.hpp
-rw-r--r-- 1 victor victor 5.1K Nov 2 18:24 core/Pipeline.hpp
$ md5sum core/Pipeline.hpp
7604940d777322a587d2fe2fa12c1183 core/Pipeline.hpp
Remoto:
$ ll core/Pipeline.hpp
-rw-r--r-- 1 victor staff 5.1K Nov 3 18:20 core/Pipeline.hpp
$ md5sum core/Pipeline.hpp
7604940d777322a587d2fe2fa12c1183 core/Pipeline.hpp
El propietario, el grupo y los tiempos no son los mismos, pero rsync no está configurado para conservarlos y está configurado parausar sumas de verificación.
La hora de las dos máquinas no está sincronizada.
Respuesta1
Un caso en el que esto puede suceder es cuando rsync transfiere archivos entre un sistema de archivos que distingue entre mayúsculas y minúsculas (normalmente Linux) y un sistema de archivos que no distingue entre mayúsculas y minúsculas (normalmente Windows y MacOS).
Si las dos rutas sincronizadas (por ejemplo, d/x
y d/X
) son las mismas después de una conversión teórica a, por ejemplo, minúsculas, entonces rsync no se da cuenta y puede transferir d/x
, luego sobrescribe el mismo archivo de destino con d/X
.
Si los archivos no contienen los mismos datos y tienen la misma marca de tiempo, los archivos siempre se actualizarán en futuras ejecuciones de rsync.
Sugiero verificar si alguna diferencia entre mayúsculas y minúsculas está causando que rsync vuelva a transferir los archivos por error. Un comando útil de Linux es:
find . | tr '[:upper:]' '[:lower:]' | LC_ALL=C sort | LC_ALL=C uniq -d
Respuesta2
Te faltan las banderas --archive
( -a
) o --times
( -t
). Sin uno de ellos, rsync
no se realizará un seguimiento del tiempo de cambio y, por lo tanto, no se podrán omitir archivos que parezcan ya copiados.
También está indicando explícitamente rsync
que se utilicen sumas de verificación para validar que los archivos se han copiado, y eso es lo que rsync
ocurre.
En términos generales, la bandera --archive
( -a
) hará casi todo lo que necesita:
rsync --exclude FOO --exclude BAR -avi --delete --stats /local/dir/ host:/remote/dir/
Es posible que desee agregar -H
para conservar los enlaces físicos (si tiene alguno) y -AX
para conservar las ACL y los atributos extendidos (si tiene alguno).
Respuesta3
TL;DR: Si usa macOS, intente usar /usr/bin/rsync en lugar del rsync de código abierto que "brew" o "nix" u otros sistemas pueden instalar. El rsync nativo comprende mejor el sistema de archivos especial de Apple y no volverá a copiar archivos sin cambios.
Versión más larga...
Una situación en la que esto puede suceder es si la versión rsync
que está utilizando no admite situaciones específicas del sistema operativo. Volverá a copiar los archivos que cree que han cambiado pero no lo han hecho.
Por ejemplo, mi Mac tiene 2 versiones de rsync
:
$ which -a rsync
/usr/local/bin/rsync
/usr/bin/rsync
/usr/local/bin/rsync
es la versión 3.2.4 que admite la versión 31 del protocolo. Lo instalé usando "brew".
/usr/bin/rsync
es la versión proporcionada por Apple, que es una bifurcación de la versión 2.6.9 (mucho más antigua) y admite la versión 29 del protocolo. Apple ha mejorado esta versión para admitir funciones del sistema de archivos específicas de macOS.
Cuando uso -c
la versión de código abierto, copia los archivos que no han cambiado. El rsync proporcionado por Apple no tiene este problema.
Si bien hay muchas optimizaciones entre las versiones 29 y 31 del protocolo, probablemente no se las perderá. Probablemente sea importante hacer las cosas correctamente utilizando rsync de Apple.
Respuesta4
Terminé cambiando aunísonopara sincronización entre Linux y macOS (y Windows):
unison \
-servercmd /usr/local/bin/unison
-ignore "Name FOO" \
-ignore "Name BAR" \
-auto \
-batch \
-force /local/dir/ \
/local/dir/ \
ssh://host/remote/dir/