¿Cómo mantener dos carpetas sincronizadas automáticamente?

86

Me gustaría tener una copia sincronizada de una carpeta con todo su subárbol.

Debería funcionar automáticamente de esta manera: cada vez que creo, modifico o elimino cosas de la carpeta original, esos cambios deben aplicarse automáticamente a la carpeta de sincronización.

¿Cuál es el mejor enfoque para esta tarea?

Por cierto: estoy en Ubuntu 12.04

El objetivo final es tener una copia de seguridad separada en tiempo real, sin el uso de enlaces simbólicos o montaje. Usé Ubuntu One para sincronizar datos entre mis computadoras y, después de un tiempo, algo salió mal y todos mis datos se perdieron durante una sincronización.

Entonces pensé en agregar un paso más para mantener una copia de respaldo de mis datos:

  • Mantengo mis datos almacenados en una "carpeta A"
  • Necesito la respuesta a mi pregunta actual para crear una sincronización unidireccional de la "carpeta A" a la "carpeta B" ( cronuna secuencia de comandos con rsync? Podría ser?). Necesito que sea unidireccional solo de A a B; los cambios en B no deben aplicarse a A.
  • El simplemente mantengo sincronizado la "carpeta B" con Ubuntu One.

    De esta manera cualquier cambio en A será subprogramado a B, que será detectado desde U1 y sincronizado con la nube. Si algo sale mal y U1 borra mis datos en B, siempre los tengo en A.

Inspirado por los comentarios de lanzz, otra idea podría ser ejecutar rsync al inicio para hacer una copia de seguridad del contenido de una carpeta en Ubuntu One, e iniciar Ubuntu One solo después de que se complete rsync.

¿Qué piensas sobre eso? ¿Cómo saber cuándo termina rsync?

Luca Borrione
fuente
¿Qué está tratando de lograr? ¿Las carpetas realmente necesitan estar separadas? ¿No se puede enlazar simbólicamente un nombre con el otro o enlazar-montar el directorio en la ubicación secundaria? Además, eche un vistazo a estos resultados de búsqueda .
Lanzz
1
Yo le aconsejaría contra la sincronización real en vivo (es decir, mirando continuamente por cambios en los archivos en el directorio de origen) a favor de periódicos rsynca través de cron.
Lanzz

Respuestas:

99

Puede usar inotifywait(con las modify,create,delete,movebanderas habilitadas) y rsync.

while inotifywait -r -e modify,create,delete,move /directory; do
    rsync -avz /directory /target
done

Si no tiene inotifywaiten su sistema, ejecutesudo apt-get install inotify-tools

silgon
fuente
3
Es posible que desee considerar la posibilidad de añadir -e ssh user@remote:/targeta rsyncsi desea utilizar SSH como el transporte para acceder a la máquina remota.
Falcon
2
Gracias @Falcon, suelo usar rsync -avz --delete --exclude-from=.rsyncignore /directory user@server:path. Sin embargo, quería escribir una respuesta simple.
silgon
4
para aclarar: ¿es esto algo que se ejecuta una sola vez, o lo agregaría a un bashrc o algo así?
Brad Johnson
1
Puede considerar todo el ciclo while como un proceso que se sincroniza cuando es necesario. Normalmente lo agrego al Makefile del proyecto en el que estoy trabajando. De esta forma puedo elegir el servidor y el directorio que quiero que se guarde. Uno de mis casos de uso es cuando programo algoritmos de aprendizaje profundo en mi computadora portátil y los sincronizo para realizar el proceso pesado en una computadora dedicada con mejor CPU y una GPU. También excluyo archivos que no necesito, como la .gitcarpeta.
silgon
2
Esto no maneja modify,create,delete,move
cambios de
24

Necesita algo como esto: https://github.com/axkibe/lsyncd Es una herramienta que combina rsync e inotify; la primera es una herramienta que refleja, con el conjunto de opciones correcto, un directorio hasta el último bit. Este último le dice al kernel que notifique a un programa de cambios en un directorio o archivo. Dice:

Agrega y combina eventos durante unos segundos y luego genera uno (o más) procesos para sincronizar los cambios.

Pero, según Digital Ocean en https://www.digitalocean.com/community/tutorials/how-to-mirror-local-and-remote-directories-on-a-vps-with-lsyncd - debería estar en el repositorio de Ubuntu!

Tengo requisitos similares y esta herramienta, que aún no he probado, parece adecuada para la tarea.

Martín
fuente
1
lsyncd al principio parecía una bala de plata, pero tiene muchos problemas abiertos y aparentemente la implementación de macOS es "vieja y desactualizada". No pude hacer que funcionara en 10.12.
un nerd pagado
@apaidnerd Para ser justos, son 90 números abiertos frente a 420 cerrados. Sin embargo, solo se cerraron 10/40 ediciones en el último año.
Mateen Ulhaq
8

Solo una simple modificación de la respuesta de @silgon:

while true; do 
  inotifywait -r -e modify,create,delete /directory
  rsync -avz /directory /target
done

(La versión de @silgon a veces se bloquea en Ubuntu 16 si la ejecuta en cron)

Denis Kuzin
fuente
2
¿Por qué lo ejecutarías en cron?
saygley
@saygley Para una tarea específica, después de reiniciar Ubuntu, el proceso de sincronización debe ejecutarse automáticamente
Denis Kuzin
5
Ya veo ... Sin embargo, dado que esto normalmente debería iniciarse una vez y estar ejecutándose mientras el servidor esté activo; En su lugar, consideraría algo incluido en rc.local.
saygley
2

Puede aprovechar fschange . Es una notificación de cambio del sistema de archivos de Linux. El código fuente se puede descargar desde el enlace anterior, puede compilarlo usted mismo. fschangese puede utilizar para realizar un seguimiento de los cambios de archivo mediante la lectura de datos de un archivo proc (/ proc / fschange). Cuando se escriben datos en un archivo, fschange informa el intervalo exacto que se ha modificado en lugar de simplemente decir que se ha cambiado el archivo. Si está buscando la solución más avanzada, le sugiero que consulte Resilio Connect . Es multiplataforma, proporciona opciones extendidas de uso y monitoreo. Dado que está basado en BitTorrent, es más rápido que cualquier otra herramienta de sincronización existente. Fue escrito en su nombre.


fuente
0

Utilizo este programa gratuito para sincronizar archivos y directorios locales: https://github.com/Fitus/Zaloha.sh . El repositorio también contiene una demostración simple.

El buen punto: es un script de shell bash (solo un archivo). No es una caja negra como otros programas. La documentación también está ahí. Además, con algunos talentos técnicos, puede "doblarlo" e "integrarlo" para crear la solución final que desee.

Petas
fuente