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

29

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 rsyncde copier des fichiers et de supprimer ceux du côté 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 .hgcô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 rsyncsupprimer tout sur le chemin de réception qui n'existe pas sur le chemin d'envoi, à l'exception de ce qui correspond dont_delete_me. Ma question est maintenant: est-ce que rsync conserverait les fichiers du côté de réception qui correspondent dont_delete_me même si rien du côté d'envoi ne correspond dont_delete_me?

Amelio Vazquez-Reina
la source

Réponses:

33

Si vous utilisez --deleteet --excludeensemble, ce qui se trouve dans 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 rsyncdu tout. Vous aurez donc besoin d'un autre rsynctravail dans syncce 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.

Richard Holloway
la source
Merci @Richard. Votre réponse me fait penser que ma question initiale a peut-être été plus facile que je ne le pensais. Si j'utilise la seule ligne:, rsync -av --exclude=dont_delete_me --delete /sending/path /receiving/pathcela ne ferait-il pas rsyncsupprimer tout sur le chemin de réception qui n'existe pas sur le chemin d'envoi, à l'exception des choses correspondant à dont_delete_me? Plus important encore, est-ce rsyncque les choses resteraient égales du côté de la réception dont_delete_me même si rien du côté de l'envoi ne corresponddont_delete_me ? Si c'est le cas, je pense que c'est la seule ligne dont j'ai besoin, non?
Amelio Vazquez-Reina
Vous avez raison, mais vous n'aurez pas non plus de nouveaux fichiers et modifications dans le dossier dont_delete_me si vous le faites sur une seule ligne. Si vous ne souhaitez pas synchroniser les modifications et les ajouts, vous pouvez simplement utiliser l'indicateur --exclude comme vous l'avez décrit ici.
Richard Holloway
@AmV Les fichiers exclus ne sont pas supprimés par --delete, sauf si vous le spécifiez explicitement --delete-excluded. Voir la description de --deleteet --delete-excludeddans le manuel rsync.
Gilles 'SO- arrête d'être méchant'
4

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 l' -noption pour effectuer un essai à sec et ne changez pas --deleteen --delete-excluded!)

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

  • Le srcrépertoire source reste inchangé
  • Le destdossier de destination correspond au dossier source, sauf que:

    • les éléments de la do_not_send_to_destliste ne sont pas envoyés à la destination, et
    • les éléments de la do_not_modify_in_destliste ne sont pas modifiés dans la destination.
  • (Remarque: ce n'est pas un problème pour les éléments inexistants d'être répertoriés dans l'un des do_not_fichiers " ".)

Explication

Je suppose que rsync lit les arguments de la ligne de commande de gauche à droite, l' --deleteargument semble amener rsync à "changer de mode" en interne (dans un sens), permettant à nouveau la deuxième utilisation de l' --exclude-fromoption mais avec une signification différente.

Caveat:

  • Si un élément de la do_not_send_to_destliste existe déjà dans la destination, alors:

    • 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: changer --deleteen --delete-excludedsupprimera tout dans la destination qui est répertoriée dans l'une de vos deux listes. xD (Peut-être que rsync était écrit pour être ouvert / flexible, mais en a-t-il avec des nuances?)

Légèrement testé à l'usage.

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

user2533809
la source