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?
Respuestas:
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):
Esto no manejará las eliminaciones, pero no estoy seguro de que haya una buena solución a ese problema con solo sincronizaciones periódicas.
fuente
¿Conoce el Sincronizador de archivos Unison ?
Tenga en cuenta también que es resistente a fallas:
fuente
Necesita ejecutar
rsync
dos veces y recomiendo ejecutarlo con-au
:-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,-a
ya 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 casorsync
no sincronizaría el archivo, lo que podría ser fatal.Pero también necesita,
-u
ya que le dicersync
que 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
rsync
se 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
rsync
sabré 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 porrsync
lo 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 arsync
.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.
rsync
no 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
rsync
un 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.fuente
Gracias jsight
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
fuente
&&
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-t
opción después de que se publicó esta respuesta.Utilizar
rsync <OPTIONS> [hostname:]source-dir [hostname:]dest-dir
por ejemplo:
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!
fuente
Estoy usando
rsync
coninotifywait
. Cuando cambie cualquier archivo,rsync
se ejecutará.Necesita ejecutar
inotifywait
en ambos hosts. Por favor, consulte el ejemplo inotifywaitfuente
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.
fuente