it-swarm-fr.com

Demander à rsync de supprimer les fichiers du côté de réception qui n'existent pas du côté de l'envoi, avec des exceptions du côté de la réception

J'ai lu ces fils:

Mais, pour autant que je sache (peut-être que je manque quelque chose), ils ne couvrent pas la question suivante:

Comment demandez-vous à rsync de copier des fichiers et de supprimer ceux du côté de réception qui n'existent pas du côté de l'envoi, à quelques exceptions près? (par exemple, ne supprimez pas un référentiel Mercurial .hg côté réception, même s'il n'y a pas de référentiel côté envoi).

Une possibilité?

Emprunt de la réponse de @Richard Holloway ci-dessous. Disons que j'ai la ligne suivante:

rsync -av --exclude=dont_delete_me --delete /sending/path /receiving/path

Pour autant que je comprends, cette ligne ferait rsync supprimer tout sur le chemin de réception qui n'existe pas sur le chemin d'envoi, sauf les choses correspondant à dont_delete_me. Ma question est maintenant: est-ce que rsync conserverait les fichiers du côté réception qui correspondent à dont_delete_me même si rien du côté de l'envoi ne correspond à dont_delete_me?

29

Si tu utilises --delete et --exclude ensemble, ce qui se trouve à l'emplacement exclu ne sera pas supprimé même si les fichiers source sont supprimés.

Mais cela soulève le problème que le dossier ne sera pas du tout rsync 'd. Vous aurez donc besoin d'un autre travail rsync pour sync ce dossier.

Par exemple.

rsync -nav /home/richardjh/keepall/ /home/backup/richardjh/keepall/
rsync -nav --exclude=keepall --delete /home/richardjh /home/backup/richardjh

Vous pouvez les exécuter dans l'autre sens, mais cela supprimerait tous les fichiers supprimés, puis les remplacerait, ce qui n'est pas aussi efficace.

Vous ne pouvez pas le faire comme une doublure.

33
Richard Holloway

J'ai trouvé que la solution suivante fonctionne pour mes besoins:

rsync -r --exclude-from=do_not_send_to_dest --delete --exclude-from=do_not_modify_in_dest src/ dest

(Remarque: ajoutez le -n option pour effectuer un essai à sec et ne pas modifier --delete à --delete-excluded!)

L'exécution de la commande entraîne les propriétés suivantes:

  • Le répertoire source src reste inchangé
  • Le dossier de destination dest correspond au dossier source, sauf que:

    • éléments sur le do_not_send_to_dest la liste n'est pas envoyée à la destination, et
    • éléments sur le do_not_modify_in_dest la liste n'est pas modifiée dans la destination.
  • (Remarque: les éléments inexistants ne posent aucun problème dans l'un des répertoires "do_not_" des dossiers.)

Explication

Je suppose que rsync lit les arguments de la ligne de commande de gauche à droite, le --delete L'argument semble entraîner rsync à "changer de mode" en interne (dans un sens), permettant la deuxième utilisation de --exclude-from encore une fois mais avec une signification différente.

Caveat:

  • Si un élément du do_not_send_to_dest la liste existe déjà dans la destination, puis:

    • cette commande ne supprime pas cet élément de la destination (sauf si l'élément est d'abord supprimé du répertoire source)
    • Attention: modification --delete à --delete-excluded supprimera tout ce qui se trouve dans la destination qui figure dans l'une de vos deux listes. xD (Peut-être que rsync a été écrit pour être ouvert/flexible, mais en a-t-il avec des nuances?)

Légèrement testé.

J'utilise "rsync version 3.0.9 protocol version 30 ".

4
user2533809