Cómo sincronizar solo archivos nuevos

144

Estoy tratando de configurar rsync para sincronizar mi servidor web principal con el servidor remoto agregando un archivo recién generado a la posterior.

Aquí está el comando que uso:

rsync -avh --update -e "ssh -i /path/to/thishost-rsync-key" remoteuser@remotehost:/foo/bar /foo/bar

Pero parece que el servidor web realmente transfiere todos los archivos a pesar del indicador '--update'. He intentado diferentes combinaciones de banderas (por ejemplo, omitiendo '-a' y usando '-uv' en su lugar) pero ninguna me ayudó. Entonces, me pregunto cómo puedo modificar el comando rsync para enviar solo archivos recién agregados. Gracias

Super Mario
fuente
2
Si desea sincronizar archivos con el servidor remoto, ¿no debería ser el último? es decir rsync /foo/bar remoteuser@remotehost:/foo/bar
ostrokach
Te podría interesar esta página web . Además, tenga cuidado con el sistema de archivos. Si el sistema de archivos del servidor no admite todas las -aopciones que implica (propietario, grupo, permisos, ...), debería ser la causa de nuestro problema.
ppr
2
Ninguna de las respuestas resuelve el problema en el que los archivos locales no se copiaron completamente en el destino remoto y solo desea sincronizar archivos más nuevos.
Axel Bregnsbo
Acabo de encontrar la -copción. Omite los archivos existentes en función de una suma de verificación, en lugar del tiempo o tamaño de modificación.
Haheute

Respuestas:

181

De man rsync:

--ignore-existing       skip updating files that exist on receiver

--updatehace algo ligeramente diferente, lo que probablemente sea la razón por la que está obteniendo resultados inesperados (ver man rsync):

Esto obliga a rsync a omitir cualquier archivo que exista en el destino y tenga una hora modificada que sea más reciente que el archivo fuente . (Si un archivo de destino existente tiene un tiempo de modificación igual al del archivo de origen, se actualizará si los tamaños son diferentes).

Chris Down
fuente
1
Bueno, en realidad probé el comando con '--noger-exist' en lugar de '--update'. Terminó rápido pero no coloca los nuevos archivos en el host remoto. ¿Algunas ideas? Gracias
supermario
13
Las páginas del manual apestan (es cierto, fui allí), por ejemplo, ¿ --ignore-existingsignifica que no transfiera los archivos que existen en el receptor, o no transfiera archivos si existe algún archivo / carpeta con el mismo nombre en el receptor?
puk
77
--update qué omitir los archivos cuando los mtimes son idénticos (que es no lo que implica la redacción). Probé esto. Creo que la redacción se entendería mejor si dijera "solo se copiarán los archivos de origen que son más nuevos que el destino".
Octopus
44
@Octopus "solo se copiarán los archivos de origen que son más nuevos que el destino" ... o los archivos de origen que tienen el mismo tiempo de modificación que sus contrapartes de archivos de destino, pero tienen tamaños diferentes . Creo que ese es un punto importante. (Chris ya cubrió eso, gracias)
Jonathan Komar
Entonces necesita --ignore-exist y -r (recursivo). -v (detallado) también es bueno tener :-)
DutchUncle
40

En mi caso tuve problemas similares, transfiriendo todos los archivos en lugar de solo los modificados / nuevos. Resolví esto usando parámetros -t(en lugar de -a) y -P(equivalente a --partial --progress):

rsync -h -v -r -P -t fuente de destino

Esto transfiere solo archivos nuevos y archivos ya existentes pero modificados: -ahace demasiado, como la sincronización de ID de usuario y grupo, que en mi caso no puede funcionar, ya que tengo diferentes usuarios y grupos en mis sistemas de origen y destino.

Los parámetros en detalle:

  • -h: números legibles por humanos
  • -v: detallado
  • -r: recurse en directorios
  • -P: --partial(mantener archivos parcialmente transferidos) +
            --progress(mostrar progreso durante la transferencia)
  • -t: preservar tiempos de modificación
t0r0X
fuente
2
+1 para '-a hace demasiado' (de hecho -rlptgoD, por lo que el permiso no se aplasta, los grupos y el propietario se preservan, no mi copia de seguridad típica para jugar ...)
Frank Nocke
2

Desde mi experiencia con rsync, una copia de partición de 1TB es demasiado grande para ser eficiente. Se necesita rsync para siempre para procesarlo. En cambio, hágalo por subdirectorios. Es decir, ejecute rsync para cada subdirectorio principal. Va mucho más rápido si no tiene que hacer malabarismos con decenas de miles de archivos.

turgut kalfaoglu
fuente
1
¿Quizás te quedaste sin memoria y tu sistema comenzó a intercambiarse?
Marcel Burkhard
-2

Tratar

rsync -zvrt --update SOURCE DESTN
omega
fuente
8
Se agradecería un poco más de explicación al comando anterior para el OP.
Peschke
de la página de manual `-u, --actualizar los archivos de omisión que son más nuevos en el receptor`
ShoeLace