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:
- escritorio
- cuaderno
- 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.
Respuestas:
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).fuente
:)
También puedes probar bitpocket: https://github.com/sickill/bitpocket
fuente
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.
fuente
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.
fuente
Prueba esto,
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).
fuente
-u
omite 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?--delete-excluded
Elimina 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"?--delete-excluded
se 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 verdaderarsync
, porque se requiere guardar el estado entre ejecuciones.Puedes probar csync , es el motor de sincronización bajo el capó de owncloud .
fuente
Ahora estoy usando SparkleShare https://www.sparkleshare.org/
funciona en mac, linux y windows.
fuente
No estoy seguro de si funciona con dos sincronizaciones, pero para que --delete funcione, también debe agregar el parámetro --recursive.
fuente
--recurse
es-r
, que el OP está usando (incrustado en el grupo de opciones comprimidas-avzru
).Puede usar cloudsync para mantener una carpeta sincronizada con un control remoto:
Si el control remoto es NFS, puede usar:
fuente
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.
fuente