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


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


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

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.


1
¿Quizás te quedaste sin memoria y tu sistema comenzó a intercambiarse?
Marcel Burkhard

-2

Tratar

rsync -zvrt --update SOURCE DESTN

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.