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 para ese problema con solo sincronizaciones periódicas.
¿Conoces Unison File Synchronizer?
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 mediante la propagación de los cambios en cada réplica a la otra. ...
Tenga en cuenta también que es resistente a fallas:
Unison es resistente al fracaso. Es cuidadoso 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.
Necesitas ejecutar rsync
dos 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
Recurse en 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 el propietario del archivo-D
También sincronizar archivos especiales (no regulares/meta)
Básicamente, cada vez que desee crear una copia idéntica uno a uno usando rsync
, siempre debes 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 caso, rsync
no sincronizaría el archivo, lo que podría ser fatal.
Pero también necesita -u
como dice eso rsync
para dejar completamente intacto cualquier archivo/carpeta, 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 reciente o no.
Tenga en cuenta que esta solución no puede manejar archivos eliminados. Manejar las eliminaciones no es posible fácilmente, ya que considere la siguiente situación:un archivo ha sido eliminado en la fuente, ahora ¿cómo rsync
saber si ese archivo existió alguna vez y se eliminó (en ese caso, también se debe eliminar en el destino) o si nunca existió en el origen (en ese caso, se debe copiar del destino). Estas dos situaciones parecen idénticas a rsync
por lo tanto, no puede saber cómo reaccionar correctamente. No ayudará sincronizar al revés, ya que eso puede conducir a la misma situación:existe un archivo en el origen pero no en el destino. ¿Por qué? ¿Nunca existió en el destino o se eliminó? Ambos casos parecen idénticos a rsync
.
Las herramientas de sincronización que pueden sincronizar de manera confiable los archivos eliminados generalmente administran un registro de sincronización sobre todas las operaciones de sincronización anteriores. Si ese registro revela que una vez hubo un archivo y se sincronizó pero ahora falta, está claro que se eliminó. Si nunca hubo 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 es correcto. rsync
no tiene dicho registro, solo se basa en el estado actual del archivo de dos lados de la operación.
Sin embargo, puede crear un comando de sincronización usando rsync
y un poco de secuencias de comandos 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.