Sincronización bidireccional con rsync

95

Tengo una carpeta a / y una carpeta remota A /. Ahora ejecuto algo como esto en un Makefile:

get-music:
 rsync -avzru server:/media/10001/music/ /media/Incoming/music/

put-music:
 rsync -avzru /media/Incoming/music/ server:/media/10001/music/

sync-music: get-music put-music

cuando hago sync-music, primero obtiene todos los diffs del servidor al local y luego al contrario, enviando todos los diffs del local al servidor.

Esto funciona muy bien solo si solo hay actualizaciones o archivos nuevos en el futuro. Si hay eliminaciones, no hace nada.

En rsync hay opciones --delete y --delete-after para ayudar a lograr lo que quiero, pero la cosa es que no funciona en una sincronización bidireccional.

Si quiero eliminar archivos del servidor en una sincronización, cuando los archivos locales se han eliminado, funciona, pero si, por alguna razón (explicada más adelante) tengo algunos archivos que no están en el servidor pero existen localmente y fueron eliminados, Quiero eliminarlos localmente y no copiarlos en el servidor (como sucede).

La cosa es que tengo 3 máquinas en contexto:

  1. escritorio
  2. cuaderno
  3. servidor doméstico

Entonces, a veces, el servidor tendrá archivos que se eliminaron con una sincronización de cuaderno, por ejemplo, y luego, cuando ejecuto una sincronización con mi escritorio (donde los archivos del servidor eliminados aún existen), quiero que estos archivos se eliminen y no copiado de nuevo en el servidor.

Supongo que esto solo es posible con una base de datos y un seguimiento de operaciones: P

¿Alguna solución más sencilla? Gracias.

mwm
fuente
1
Yo tengo este mismo problema. ¿Encontraste una solución, mwm?
mouche
7
en realidad lo hice ahora. Estaba tratando de lograr una experiencia similar a Dropbox y se me ocurrió una solución que involucra unísono (que usa rsync) y lsyncd para monitorear los cambios de archivos. También encontré a otras personas con esta solución y más trucos en la parte superior » cerebralmastication.com/2011/04/fast-two-way-sync-in-ubuntu
mwm
hoy en día estoy usando nextcloud localmente en mi servidor doméstico. perfecta solución de "dropbox" 100% gestionada por mí. tiene clientes android / ios / win / macos / linux / web.
mwm

Respuestas:

63

Pruebe Unison: http://www.cis.upenn.edu/~bcpierce/unison/

Sintaxis: unison dirA/ dirB/

Unison pregunta qué hacer cuando los archivos son diferentes, pero puede automatizar el proceso utilizando lo siguiente, que acepta opciones predeterminadas (no conflictivas):

unison -auto dirA/ dirB/

unison -batch dirA/ dirB/ no hace ninguna pregunta y escribe para mostrar cuántos archivos se ignoraron (porque entraron en conflicto).

alex
fuente
7
Unison es bastante fácil de usar para directorios pequeños. Pero es terriblemente LENTO para directorios con una gran cantidad de archivos. Donde rsync comenzará a copiar casi de inmediato, unison a veces toma más de 12 horas para comenzar a copiar, porque escanea cada archivo antes de copiar cualquier cosa.
Brent Faust
1
¿Git bueno en esto? Al menos git es fácil de usar y el transporte es rápido. Para blob hay una extensión desarrollada por github llamada Large File Storage .
Wener
1
Los principales problemas de git son los archivos grandes y que está realmente diseñado para confirmaciones explícitas. Ambos pueden mejorarse razonablemente con complementos como git-Annex, almacenamiento de archivos grandes, etc.
alex
3
@wener No use un martillo como tornillo ni un destornillador como clavo. :)
ADTC
2
el unísono es genial, pero también muy poco fiable. En aproximadamente el 50% de mis casos de uso, lo simple no ha funcionado. La causa más común de esto es una capacidad deficiente entre versiones. A veces sincronizo con contenido en una computadora en la que no tengo privilegios. Si ese servidor tiene una versión diferente a la mía, el unísono falla. Además, recientemente tuve un error entre clientes unísonos de la misma versión, porque estaban usando diferentes versiones compiladas de alguna biblioteca (esto fue entre una computadora ubuntu y una raspberry pi).
argentum2f
5

Puede usar Osync: http://www.netpower.fr/osync , que está basado en rsync con propagación de eliminación inteligente. también tiene múltiples opciones como reanudar una ejecución detenida, eliminación suave y control de tiempo.

Orsiris de Jong
fuente
5

Dado que la pregunta original también involucra una computadora de escritorio y una computadora portátil y un ejemplo que involucra archivos de música (por lo tanto, probablemente esté usando una GUI), también mencionaría uno de los mejores programas bidireccionales, multiplataforma, gratuitos y de código abierto hasta la fecha: FreeFileSync .

Está basado en GUI, es muy rápido e intuitivo, viene con filtrado y muchas otras opciones, incluida la capacidad de conectarse remotamente, ver y administrar interactivamente "colisiones" (por ejemplo, archivos con marcas de tiempo similares) y para cambiar entre transferencia bidireccional, duplicación y pronto.

Dario Fumagalli
fuente
4

Prueba esto,

get-music:
 rsync -avzru --delete-excluded server:/media/10001/music/ /media/Incoming/music/

put-music:
 rsync -avzru --delete-excluded /media/Incoming/music/ server:/media/10001/music/

sync-music: get-music put-music

Solo probé esto y funcionó para mí. Estoy haciendo una sincronización bidireccional entre Windows7 (usando cygwin con el paquete rsync instalado) y el servidor de archivos FreeNAS (FreeNAS se ejecuta en FreeBSD con el paquete rsync preinstalado).

Chris Collins
fuente
3
¿No eliminará esto los archivos locales nuevos? -uomite archivos más recientes en el destino, pero rsync no tiene una forma de rastrear la antigüedad de una eliminación, entonces, ¿cómo podría este script diferenciar entre cuándo un archivo local es nuevo (y debe mantenerse) o antiguo (y debe eliminarse)? ? ¿O lo estoy entendiendo mal?
Matthemattics
¿ --delete-excludedElimina algún archivo que exista en los directorios de destino pero no en los directorios de origen? Pensé que tenías que definirlo, ¿ --exclude=<filename>así que rsync solo eliminará estas exclusiones? ¿O rsync trata todos los archivos de directorio que no son de origen como "excluidos"?
Mr_Moneybags
2
Encontré la respuesta: además de eliminar los archivos en el lado de recepción que no están en el lado de envío, esto le dice a rsync que también elimine cualquier archivo en el lado de recepción que esté excluido (ver --exclude
Mr_Moneybags
2
Por lo que tengo entendido, si creo un archivo en el destino y luego ejecuto el comando rsync para copiar desde el origen al destino, eliminará el archivo en el destino, ya que no se utilizan marcas de tiempo. Esto no es lo que quieres, ¿verdad?
elexhobby
10
@ Lübnah: Correcto; esta solución no es una sincronización bidireccional completa : debido a que rsync con --delete-excludedse ejecuta primero con el servidor como origen : los archivos agregados localmente se eliminarán durante esa ejecución (mientras que los archivos agregados al servidor se copian en el destino local). Los únicos archivos locales sincronizados con el servidor son archivos que también existen en el servidor y se modificaron localmente (más recientemente que las versiones del servidor), lo que no es probable en el escenario del OP. Como insinúas, creo que no se puede realizar la sincronización bidireccional verdadera rsync, porque se requiere guardar el estado entre ejecuciones.
mklement0
1

Ahora estoy usando SparkleShare https://www.sparkleshare.org/

funciona en mac, linux y windows.

mwm
fuente
a medida que pasa el tiempo, sigo actualizando mi solución. Ahora estoy usando nextcloud en mi servidor doméstico. sincronizar con el cliente nextcloud en linux, mac, windows, android e ios.
mwm
0

No estoy seguro de si funciona con dos sincronizaciones, pero para que --delete funcione, también debe agregar el parámetro --recursive.

Boardy
fuente
1
El equivalente corto de option --recursees -r, que el OP está usando (incrustado en el grupo de opciones comprimidas -avzru).
mklement0
0

Puede usar cloudsync para mantener una carpeta sincronizada con un control remoto:

pip install cloudsync
pip install cloudsync-gdrive
cloudsync sync file:c:/users/me/documents gdrive:/mydocs

Si el control remoto es NFS, puede usar:

cloudsync sync file:c:/users/me/documents/ file:/mnt/nfs/whatevs
Erik Aronesty
fuente
-1

Rclone es lo que estás buscando. Rclone ("rsync para almacenamiento en la nube") es un programa de línea de comandos para sincronizar archivos y directorios desde y hacia diferentes proveedores de almacenamiento en la nube, incluidos los sistemas de archivos locales. Rclone se conocía anteriormente como Swiftsync y ha estado disponible desde 2013.

usuario1461607
fuente
No admite sincronización bidireccional: rclone.org/commands/rclone_sync
Martin Braun