RSync: ¿Cómo sincronizo en ambas direcciones?

82

Quiero usar rsync para sincronizar dos directorios en ambas direcciones.

Me refiero a la sincronización en sentido clásico ( no como se entiende en los manuales de rsync):
quiero actualizar los directorios en ambas direcciones , dependiendo de cuál de ellos sea más nuevo .

¿Se puede hacer esto mediante rsync (preferiblemente en modo Linux) ?
Si no es así, ¿qué otras soluciones existen?

java.is.for.desktop
fuente
3
Creo que en serverfault.com obtendrás mejores respuestas.
Esteban Küber

Respuestas:

77

Simplemente ejecútelo dos veces, con el modo "más nuevo" (-u o --update flag) más -t (para copiar el tiempo de modificación del archivo), -r (para carpetas recursivas) y -v (para salida detallada para ver qué es haciendo):

rsync -rtuv /path/to/dir_a/* /path/to/dir_b
rsync -rtuv /path/to/dir_b/* /path/to/dir_a

Esto no manejará las eliminaciones, pero no estoy seguro de que haya una buena solución a ese problema con solo sincronizaciones periódicas.

jsight
fuente
3
Dado que la pregunta era sobre rsync, marcaré esta respuesta como correcta.
java.is.for.desktop
2
Pero también preguntaste sobre otras soluciones y Unison hizo un mejor trabajo, de lo contrario, nunca mencionaría otra herramienta. Entiendo que quizás tengas circunstancias específicas que favorezcan el uso de rsync.
MaD70
1
Joder, ¿obtienes 6 votos a favor y sigues quejándote? <j / k> Unison es una solución realmente interesante y me alegra que lo hayas mencionado. :)
jsight
2
Bueno, no me quejo, te lo estoy explicando. Solo para comprobar que no me falta algo (no ser un hablante nativo de inglés).
MaD70
1
MaD70 - No hay problema ... solo estaba bromeando. :)
jsight
63

¿Conoce el Sincronizador de archivos Unison ?

Unison es una herramienta de sincronización de archivos para Unix y Windows. Permite que dos réplicas de una colección de archivos y directorios se almacenen en diferentes hosts (o diferentes discos en el mismo host), se modifiquen por separado y luego se actualicen propagando los cambios de cada réplica a la otra. ...

Tenga en cuenta también que es resistente a fallas:

Unison es resistente al fracaso. Tenga cuidado de dejar las réplicas y sus propias estructuras privadas en un estado sensible en todo momento, incluso en caso de terminación anormal o fallas de comunicación.

MaD70
fuente
2
+1. Unison es la mejor manera de hacer esto. Double-rsync es difícil de hacer bien y no maneja eliminaciones en absoluto.
Avdi
Sí, Unison es resistente a fallas. Estoy actualizando mi respuesta para enfatizar esto.
MaD70
4
No había oído hablar de Unison. Usted es responsable de hacerme rehacer mis scripts de respaldo en casa hoy.
Esteban Küber
1
Me alegra que mi respuesta sea tan útil (esto muestra cómo podría ser práctica una herramienta basada en una sólida base teórica).
MaD70
Aquí hay un breve tutorial de Unison en linuxjournal.
lepe
12

Necesita ejecutar rsyncdos veces y recomiendo ejecutarlo con -au:

rsync -au /local/source/* /remote/destination
rsync -au /remote/destination/* /local/source

-a(a para archivo) es un atajo para -rlptgoD:

  • -r Recurrir a subdirectorios
  • -l También sincroniza enlaces simbólicos
  • -p También sincronizar permisos de archivos
  • -t También sincroniza los tiempos de modificación de archivos
  • -g También sincronizar grupos de archivos
  • -o También sincronizar propietario del archivo
  • -D También sincroniza archivos especiales (no regulares / meta)

Básicamente, siempre que desee crear una copia idéntica uno a uno utilizando rsync, siempre debe usar, -aya que eso es lo que la mayoría de los usuarios esperan que suceda cuando hablan de " sincronización ". Otras respuestas aquí parecen pasar por alto que a veces el contenido de un archivo permanece sin cambios, pero su propietario puede haber cambiado o sus permisos de acceso pueden haber cambiado y en ese caso rsyncno sincronizaría el archivo, lo que podría ser fatal.

Pero también necesita, -uya que le dice rsyncque deje completamente cualquier archivo / carpeta solo, en caso de que ya exista en el destino y tenga una fecha de última modificación más reciente. Sin -u rsyncse sincronizaría independientemente de si un archivo / carpeta es más nuevo o no .

Tenga en cuenta que esta solución no puede manejar archivos eliminados. No es fácil manejar las eliminaciones, ya que considere la siguiente situación: Se eliminó un archivo en el origen, ahora, ¿cómo rsyncsabré si ese archivo existió una vez y se eliminó (en ese caso también debe eliminarse en el destino) o nunca existió en la fuente (en ese caso, debe copiarse desde el destino). Estas dos situaciones parecen idénticas por rsynclo que no puede saber cómo reaccionar correctamente. No ayudará a sincronizar al revés, ya que puede llevar a la misma situación: existe un archivo en el origen pero no en el destino. ¿Por qué? ¿Nunca ha existido en el destino o se ha eliminado? Ambos casos parecen idénticos a rsync.

Las herramientas de sincronización que pueden sincronizar archivos eliminados de manera confiable generalmente administran un registro de sincronización sobre todas las operaciones de sincronización anteriores. Si ese registro revela que alguna vez hubo un archivo y se sincronizó, pero ahora falta, está claro que se ha eliminado. Si nunca existió un archivo de este tipo según el registro, debe sincronizarse. Al almacenar todas las entradas de registro con marcas de tiempo, incluso es posible que un archivo eliminado regrese y se elimine varias veces, pero la herramienta de sincronización siempre sabrá qué hacer y el resultado siempre será correcto. rsyncno tiene tal registro, solo se basa en el estado actual del archivo de dos lados de la operación.

Sin embargo, puede crear usted mismo un comando de sincronización utilizando rsyncun poco de script de shell POSIX que ya se acerca mucho a una herramienta de sincronización como se describe anteriormente. Como yo mismo necesitaba una herramienta de este tipo , aquí hay una respuesta en Stackoverflow que lo guía a través de la creación de dicho script.

Mecki
fuente
Bellamente puesto.
Peter Rowntree
6

Gracias jsight

rsync -urv --progress dir_a dir_b && rsync -urv  --progress dir_b dir_a

Esto daría lugar a que la segunda sincronización se produzca inmediatamente después de que finalice la primera sincronización. En caso de que la estructura del directorio sea enorme, esto ahorrará tiempo, ya que no es necesario sentarse delante de la PC. Si la estructura es enorme, elimine las cosas detalladas y de progreso

rsync -ur dir_a dir_b && rsync -ur dir_b dir_a
Mayank Agarwal
fuente
1
Me pregunto si debería agregar -t para copiar la hora de modificación del archivo. ¿Hay alguna razón por la que deba dejar de lado?
crips
@Chrips No, no lo creo. Parece que el propósito de esta respuesta era solo mostrar que puede usar &&entre los dos comandos para ejecutar automáticamente el segundo comando inmediatamente después del primer comando (si el primer comando tiene éxito), en lugar de ejecutar manualmente uno tras otro como en la respuesta de @ jsight. Además, creo que la respuesta de @ jsight se editó para incluir la -topción después de que se publicó esta respuesta.
Ruben9922
1

Utilizar rsync <OPTIONS> [hostname:]source-dir [hostname:]dest-dir

por ejemplo:

rsync -pogtEtvr --progress --bwlimit=2000 xxx-files different-stuff

Sincronizará archivos xxx con archivos xxx / cosas diferentes. Si no existían archivos xxx / cosas diferentes, lo creará, es decir, lo copiará.

-pogtEtv - solo un montón de opciones para preservar los metadatos del archivo, más v - detallado y r - recursivo

--progress - muestra el progreso de la sincronización en tiempo real - muy útil si copias archivos grandes

--bwlimit=2000 - establece la velocidad máxima de copia / sincronización (bw = ancho de banda)

PS rsync es de vital importancia cuando trabaja en la red, en el caso de una máquina local, puede usar comandos como cp .

¡Buena suerte!

Bohdan
fuente
0

Estoy usando rsynccon inotifywait. Cuando cambie cualquier archivo, rsyncse ejecutará.

inotifywait -m --exclude "$_LOG_FILE" -r -e create,delete,delete_self,modify,moved_to --format "%w%f" "$folder"

Necesita ejecutar inotifywaiten ambos hosts. Por favor, consulte el ejemplo inotifywait

añado
fuente
0

Lo que necesitas es Rclone . Rclone ("rsync para almacenamiento en la nube") es un programa de línea de comandos de Linux para sincronizar archivos y directorios desde y hacia diferentes proveedores de almacenamiento en la nube (box, dropbox, ftp, etc.) y sistemas de archivos locales. Rlone solo admite la sincronización de espejo.

Otra solución más gráfica que incluye sincronización en tiempo real sería utilizar FreeFileSync , que incluye el programa RealTimeSync. FreefileSync admite sincronización bidireccional bidireccional que incluye el manejo de eliminaciones.

Interfaz gráfica de usuario de FreFileSync

usuario1461607
fuente