Comment faire en sorte que rsync supprime les fichiers supprimés du dossier source?

195

J'ai récemment installé une machine avec Ubuntu Server pour héberger des serveurs de jeux. J'ai installé un plug-in de sauvegarde pour chaque serveur de jeu qui crée des sauvegardes fréquentes des fichiers du monde du jeu dans un dossier particulier de la machine. J'ai également créé une crontâche pour copier automatiquement ces sauvegardes dans mon dossier Dropbox chaque nuit à l'aide de rsync avec l' -aoption.

Après quelques mois, mon compte Dropbox a atteint sa limite de stockage et je me suis rendu compte que je ne serais pas en mesure de conserver autant de sauvegardes. J'ai donc configuré le plug-in de sauvegarde du serveur de jeu pour ne pas conserver autant de sauvegardes, puis j'ai attendu quelques jours pour voir s'il le ferait supprimez les anciennes sauvegardes comme il est prévu de le faire toutes les semaines. Le plug-in de sauvegarde a finalement fait son travail et a supprimé les sauvegardes les plus anciennes. Je m'attendais donc à ce que la rsynctâche périodique supprime ultérieurement les sauvegardes les plus anciennes de mon dossier Dropbox pour qu'elles correspondent au dossier source, mais ce n'est pas le cas. J'ai donc quelques questions:

  • Par défaut, ajoute- t-il rsyncuniquement les fichiers du dossier de destination ajoutés au dossier source et modifie-t-il les fichiers modifiés dans le dossier source sans supprimer les fichiers supprimés du dossier source?

  • Si tel est le cas, quel est le meilleur moyen de le faire rsync? Je souhaite que le dossier de destination reflète parfaitement le dossier source, ce qui signifie la suppression de tous les fichiers supprimés du dossier source.

Je vois quelques options listées dans la page de manuel pour rsyncque cela puisse faire l'affaire, mais comme je ne suis pas familier avec.

utilisateur254251
la source

Réponses:

228

Pour supprimer des fichiers dans la cible, ajoutez l' --deleteoption à votre commande. Par exemple:

rsync -avh source/ dest/ --delete
GarethD
la source
15
Assurez-vous que la source est un répertoire. L'utilisation source/* dest/ne fonctionnera pas.
Tom Saleeba
3
J'ai trouvé cet événement avec --deleteou --delete-afteril ne sera pas supprimé à cause d'erreurs: "Erreur IO rencontrée - suppression de fichier ignorée". Pour résoudre cette --ignore-errorsoption, ajoutez et corrigez les erreurs séparément
MHT
12
Fonctionne parfaitement! Même si cela fonctionne, je recommanderais TOUJOURS d'utiliser l' -n, --dry-runoption, avant de l'utiliser rsync, spécialement lorsqu'il s'agit d'options comme celles-ci ( --delete). Cela évitera tout mal de tête possible :).
ivanleoncz
2
@MHT: Aucune réponse ne semble être complète sans votre commentaire.
Lonnie Best
2
@TheBicentennialMan -a implique -r .
x-yuri
45

La commande rsync ne supprimera aucun fichier tant que vous utiliserez certaines de ses options deletedans cette commande. Ainsi, si un fichier ou un dossier est ajouté à la source, il sera synchronisé avec la cible sans aucune suppression.

Je vous suggère d'utiliser rsyncpour effectuer une sauvegarde à partir de fichiers source et find ... rmpour supprimer des fichiers pendant une période donnée ou de la taille des fichiers:

rsync [options] SOURCE TARGET
find TARGET -maxdepth 1 -type f -mtime +60 -exec rm -f {} \;

Le bloc de code ci-dessus, effectuez une sauvegarde à partir de la source, puis supprimez tous les fichiers dont la date de dernière modification est supérieure à 2 mois.

MISE À JOUR

Comme je constate que les deleteoptions ne concernent que CIBLE, si certains fichiers sont supprimés de la source, rsync --deletesupprimez-les de TARGET. Et l' deleteoption by afteret before, comme mentionné dans sa page de manuel:

--delete-before         receiver deletes before transfer, not during

Signifie que:

  1. rsync supprime les fichiers de TARGET qui sont supprimés de SOURCE.
  2. rsync lance la synchronisation des fichiers.

--delete-after receiver deletes after transfer, not during

Signifie que:

  1. rsync lance la synchronisation des fichiers.
  2. rsync supprime le fichier de TARGET qui est supprimé de SOURCE après la synchronisation.

NOTE : la --delete-{before/after}machine vient juste de cibler.

shgnInc
la source
1
Merci pour la réponse!! Faites-vous référence à une option "delete" pour rsync? Pourquoi ne puis-je pas simplement utiliser l'option "supprimer" pour rsync?
user254251
@ user254251, Si vous utilisez delete, la commande rsync supprime immédiatement les fichiers. Mais dans ce cas, il y a plus de temps pour les erreurs.
ShgnInc
Si je comprends bien, vous dites que je devrais séparer la tâche de suppression de la tâche rsync pour éviter les erreurs. Cependant j'ai une question. La page de manuel de rsync répertorie certaines options qui semblent servir à séparer la tâche de suppression en l’exécutant avant ou après la tâche de copie. Par exemple, je vois deux options appelées --delete-before et --delete-after. Est-ce que rsync avec ces options aurait le même effet que la méthode que vous avez décrite? J'ai lu la description complète de chaque option sur la page de manuel, mais il y a des informations dans les descriptions que je ne comprends pas.
user254251
@ user254251, la réponse a été mise à jour. Je ne sais pas s'il existe un moyen de supprimer des fichiers de TARGET en limitant la durée d'utilisation de rsync .
shgnInc
Merci! Alors pensez-vous que je suis à l'abri des erreurs si j'utilise simplement l'option --delete-before? Je ne spécifie pas de délai d'expiration, je ne devrais donc pas avoir à m'inquiéter si l'étape de suppression de rsync retarde l'étape de transfert. rsync s'exécute une fois par jour, ce qui vous laisse beaucoup de temps pour synchroniser les fichiers de sauvegarde avant la synchronisation suivante. Je n'aurais donc pas besoin de limiter la synchronisation dans le temps.
user254251
6

Cette commande copie les données d’incrémentation et les maintient synchronisées avec le serveur distant.

  1. Il ne copie que les données incrémentielles.
  2. Il supprimera toutes les données supprimées de la source.
  3. Il copie à nouveau à partir de la source si des données sont supprimées à la destination.
  4. En gros, cette commande maintiendra l’environnement synchronisé.

rsync -avWe ssh --delete-before (source) root@localhost:(destination) rsync -avW --delete-before -e ssh (source) root@localhost:(destination)

Exemple:

rsync -avWe ssh --delete-before /data [email protected]:/backup
rsync -avW --delete-before -e ssh /data [email protected]:/backup
Ganesh Ghube
la source
2
Je pense que -W fait en sorte de ne pas copier uniquement des données incrémentielles, mais de toujours copier des fichiers entiers.
Tulains Córdova
J'ai eu cette erreur en exécutant cette commande: rsync: Failed to exec --delete-before: No such file or directory (2)
Jeff Tian
1

S'il y a des erreurs au cours d' une scync rsync, rsync ne supprimera pas correctement les fichiers qu'il devrait avoir, même si vous avez utilisé --delete, --delete-afterou --delete-before.

C'est pourquoi il est important de traiter les erreurs rsync.

La plupart de mes erreurs étaient dues à l'utilisation de l' --permsoption lors de la synchronisation avec un système de fichiers non-Linux. Lorsque j'ai remplacé --permspar --no-perms, ces erreurs ont disparu, puis la suppression a fonctionné.

--permsest correct lorsque vous synchronisez un système de fichiers Linux vers un autre système de fichiers Linux, mais si vous synchronisez depuis Linux vers un système de fichiers non Linux (tel que NTFS, FAT), --permsdes erreurs se produisent car rsync ne peut pas définir d'autorisations Linux sur une machine. systèmes de fichiers non-linux . Encore une fois, errors = no delete.

- Lors de la synchronisation à une partition non-Linux, je l' utilise --no-permspour éviter les erreurs de sabotage --delete, --delete-afterou --delete-before.

Si vous avez toujours des erreurs après cela et que vous ne savez pas comment les résoudre, vous pouvez exécuter une commande exclusivement dédiée à la suppression des fichiers désynchronisés:

sudo rsync -r --delete --existing --ignore-existing --ignore-errors --progress /path/to/source/ /path/to/destination

La commande ci-dessus supprimera les éléments désynchronisés, mais ne synchronisera aucun fichier. Donc, vous devriez synchroniser à nouveau après cela. Cette commande est basée sur cette réponse , si ce n'est que j'ai ajouté l' --ignore-errorsargument également, de sorte qu'il serait supprimé même s'il y avait des erreurs.

Lonnie Best
la source
1
Merci pour le conseil! Je suis l'auteur original de cette question il y a 5 ans. Je suis vraiment ravi que vous ayez posté ceci, parce que j'ai prévu de mettre en place la synchronisation sur un disque NTFS dans un avenir proche, et j'aurais probablement rencontré l'erreur d'autorisations parce que je prévoyais d'utiliser l'option "-a" pour rsync, qui synchronise les autorisations (entre autres). J'ai donc ajouté "--no-perms" à mes notes. Je prévois maintenant d’utiliser rsync -a --no-perms --delete-before. J'ai une question: --delete-before ne permettrait-il pas d'éviter les problèmes de suppression de fichier en exécutant la suppression avant la synchronisation? Pensé que c'était son but.
user254251
@ user254251 - Je ne suis pas certain. Je suppose que cela dépend de la rapidité avec laquelle il "supprime avant". Si vous rencontrez une erreur avant que la suppression ne commence, vous êtes foutu. Mon conseil est d'éviter NTFS à tout moment, sauf si vous aimez les douleurs aiguës dans le cul :). NTFS à NTFS fonctionne bien. NTFS à Linix fonctionne bien. Évitez "Système de fichiers Linux" en "Système de fichiers non Linux"; il est trop pénible de s’assurer que la suppression fonctionne correctement. Vous POUVEZ accomplir cela, mais j’ai décidé que cela ne valait pas la peine, mais simplement de formater le lecteur de destination en tant que EXT4.
Lonnie Best