Question Comment faire pour que rsync supprime les fichiers supprimés du dossier source?


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 de fichiers de jeu dans un dossier particulier de la machine. J'ai aussi établi un cron tâche de copier automatiquement ces sauvegardes dans mon dossier Dropbox chaque nuit en utilisant rsync avec le -a option.

Après quelques mois, mon compte Dropbox a atteint sa limite de stockage et je me suis rendu compte que je ne pourrais pas conserver autant de sauvegardes. J'ai donc configuré le plug-in de sauvegarde pour ne pas conserver autant de sauvegardes, puis Supprimez les sauvegardes plus anciennes comme il est prévu d'effectuer chaque semaine. Le plug-in de sauvegarde a finalement fait son travail et a supprimé les anciennes sauvegardes, donc je m'attendais à la rsync cron tâche pour ensuite supprimer les anciennes sauvegardes de mon dossier Dropbox pour correspondre au dossier source, mais il ne l'a pas fait. J'ai donc quelques questions:

  • Par défaut, est-ce que rsync seulement ajouter fichiers dans le dossier de destination qui ont été ajoutés au dossier source et changement des fichiers qui ont été modifiés dans le dossier source mais Pas supprimer des dossiers qui ont été supprimés du dossier source?

  • Si tel est le cas, quelle est la meilleure façon de faire rsync fais ça? je voulez que le dossier de destination reflète parfaitement le dossier source, et cela signifie supprimer tous les fichiers supprimés de la source dossier.

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


128
2018-06-03 03:53


origine




Réponses:


Pour supprimer des fichiers dans la cible, ajoutez le --delete option à votre commande. Par exemple:

rsync -avh source/ dest/ --delete

146
2017-08-26 07:14



Peut-être en utilisant -aqr serait plutôt une idée :) - TheBicentennialMan
Assurez-vous que la source est un répertoire. En utilisant source/* dest/ ne marchera pas - Tom Saleeba
J'ai trouvé cet événement avec --delete ou --delete-after il ne sera pas effacé à cause de certaines erreurs: "erreur d'E / S rencontrée - suppression de la suppression de fichier". Pour résoudre cet ajout --ignore-errors option et déboguer les erreurs séparément - MHT
Fonctionne parfaitement! Même si cela fonctionne, je recommanderais TOUJOURS utiliser -n, --dry-run option, avant de courir rsync, spécialement en ce qui concerne les options comme celles-ci (--delete). Cela évitera tout mal de tête possible :). - ivanleoncz
@MHT: Aucune réponse ne semble être complète sans votre commentaire. - Lonnie Best


le rsync commande ne supprimera aucun fichier pendant que vous utilisez certaines de ses options delete dans cette commande. Ainsi, si un fichier ou un dossier est ajouté dans la source, il sera synchronisé avec la cible sans aucune suppression.

Je vous suggère d'utiliser rsync pour faire une sauvegarde à partir de fichiers source et utiliser find ... rm pour les fichiers de suppression pour la période ou 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 l'heure de dernière modification est supérieure à 2 mois.

METTRE À JOUR

Comme je trouve que le delete les options sont juste pour CIBLE que si certains fichiers sont supprimés de la source, rsync --delete les retirer de TARGET. Et le delete option par after et before, comme mentionné dans sa page de manuel:

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

Signifie que:

  1. rsync supprime le fichier de TARGET qui est supprimé de SOURCE.
  2. rsync commence la synchronisation des fichiers.

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

Signifie que:

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

REMARQUE: la --delete-{before/after} mettre en œuvre juste dans CIBLE.


32
2018-06-03 04:13



Merci pour la réponse!! Faites-vous référence à une option "supprimer" pour rsync? Pourquoi ne puis-je pas 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 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 y a un moyen de supprimer les fichiers de TARGET par limitation de temps dans rsync. - shgnInc
Merci! Donc, 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'attente, je ne devrais donc pas 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 est suffisant pour synchroniser les fichiers de sauvegarde avant la prochaine synchronisation. Je ne devrais donc pas non plus avoir besoin de limiter la synchronisation. - user254251


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

  1. Il ne copiera que les données incrémentielles.
  2. Il supprimera si des données sont supprimées de la source.
  3. Il copie à nouveau depuis la source si des données sont supprimées à destination.
  4. Fondamentalement, cette commande gardera les deux environnements synchronisés.

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 root@192.168.254.254:/backup
rsync -avW --delete-before -e ssh /data root@192.168.254.254:/backup

5
2017-07-29 12:12



Je pense que -W ne permet pas de 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