Il suffit de l'exécuter deux fois, avec le mode "plus récent" (indicateur -u ou --update) plus -t (pour copier l'heure de modification du fichier), -r (pour les dossiers récursifs) et -v (pour une sortie détaillée pour voir ce que c'est faire):
rsync -rtuv /path/to/dir_a/* /path/to/dir_b
rsync -rtuv /path/to/dir_b/* /path/to/dir_a
Cela ne gérera pas les suppressions, mais je ne suis pas sûr qu'il existe une bonne solution à ce problème avec uniquement une synchronisation périodique.
Connaissez-vous Unison File Synchronizer ?
Unison est un outil de synchronisation de fichiers pour Unix et Windows. Il permet de stocker deux répliques d'un ensemble de fichiers et de répertoires sur des hôtes différents (ou des disques différents sur le même hôte), de les modifier séparément, puis de les mettre à jour en propageant les modifications de chaque réplique à l'autre. ...
Notez également qu'il est résistant aux pannes :
Unisson est résistant à l'échec. Il est prudent de laisser les répliques et ses propres structures privées dans un état sensible à tout moment, même en cas de terminaison anormale ou de panne de communication.
Vous devez exécuter rsync
deux fois et je recommande de l'exécuter avec -au
:
rsync -au /local/source/* /remote/destination
rsync -au /remote/destination/* /local/source
-a
(a pour archive) est un raccourci pour -rlptgoD
:
-r
Parcourir les sous-répertoires-l
Synchroniser également les liens symboliques-p
Synchroniser également les autorisations de fichiers-t
Synchroniser également les heures de modification des fichiers-g
Synchroniser également les groupes de fichiers-o
Synchroniser également le propriétaire du fichier-D
Synchronisez également les fichiers spéciaux (non réguliers/méta)
Fondamentalement, chaque fois que vous souhaitez créer une copie identique un à un en utilisant rsync
, vous devez toujours utiliser -a
car c'est ce à quoi la plupart des utilisateurs s'attendent lorsqu'ils parlent de "synchronisation ". D'autres réponses ici semblent ignorer que parfois le contenu d'un fichier reste inchangé mais que son propriétaire peut avoir changé ou que ses autorisations d'accès peuvent avoir changé et dans ce cas rsync
ne synchroniserait pas le fichier, ce qui pourrait être fatal.
Mais vous avez également besoin de -u
comme cela indique rsync
pour laisser complètement n'importe quel fichier/dossier seul, au cas où il existe déjà à la destination et a une date de dernière modification plus récente. Sans -u
rsync
se synchroniserait, qu'un fichier/dossier soit plus récent ou non.
Veuillez noter que cette solution ne peut pas gérer les fichiers supprimés. La gestion des suppressions n'est pas facilement possible, car considérez la situation suivante :un fichier a été supprimé à la source, comment procéder maintenant ? rsync
savoir si ce fichier a déjà existé et a été supprimé (dans ce cas, il doit également être supprimé à la destination) ou s'il n'a jamais existé à la source (dans ce cas, il doit être copié à partir de la destination). Ces deux situations semblent identiques à rsync
il ne peut donc pas savoir comment réagir correctement. Cela n'aidera pas à synchroniser dans l'autre sens car cela peut conduire à la même situation :un fichier existe à la source mais pas à la destination. Pourquoi? N'a-t-il jamais existé à destination ou a-t-il été supprimé ? Les deux cas semblent identiques à rsync
.
Les outils de synchronisation qui peuvent synchroniser de manière fiable les fichiers supprimés gèrent généralement un journal de synchronisation sur toutes les opérations de synchronisation passées. Si ce journal révèle qu'il y avait autrefois un fichier et qu'il a été synchronisé mais qu'il est maintenant manquant, il est clair qu'il a été supprimé. S'il n'y a jamais eu un tel fichier selon le journal, il doit être synchronisé. En stockant toutes les entrées de journal avec des horodatages, il est même possible qu'un fichier supprimé revienne et soit supprimé plusieurs fois, mais l'outil de synchronisation saura toujours quoi faire et le résultat est toujours correct. rsync
n'a pas un tel journal, il s'appuie uniquement sur l'état actuel du fichier des deux côtés de l'opération.
Vous pouvez cependant créer vous-même une commande de synchronisation en utilisant rsync
et un peu de script shell POSIX qui se rapproche déjà beaucoup d'un outil de synchronisation comme décrit ci-dessus. Comme j'avais moi-même besoin d'un tel outil, voici une réponse sur Stackoverflow qui vous guide dans la création d'un tel script.