306 votes

Comment faire pour que rsync supprime les fichiers qui ont été supprimés du dossier source ?

J'ai récemment mis en place une machine avec Ubuntu Server pour héberger des serveurs de jeux. J'ai installé un plugin de sauvegarde pour chaque serveur de jeu qui crée des sauvegardes fréquentes des fichiers du monde de jeu dans un dossier particulier de la machine. J'ai également établi un cron pour copier automatiquement ces sauvegardes vers mon dossier Dropbox tous les soirs en utilisant rsync avec l'option -a option.

Après quelques mois, mon compte Dropbox a atteint sa limite de stockage et j'ai réalisé que je ne serais pas en mesure de conserver autant de sauvegardes, j'ai donc configuré le plugin de sauvegarde du serveur de jeu pour ne pas conserver autant de sauvegardes, puis j'ai attendu quelques jours pour voir s'il allait supprimer les anciennes sauvegardes comme il est prévu de le faire sur une base hebdomadaire. Le plugin de sauvegarde a fini par faire son travail et a supprimé les anciennes sauvegardes, je m'attendais donc à ce que le plugin de sauvegarde du serveur de jeu soit désactivé. rsync une tâche cron pour supprimer ultérieurement les anciennes sauvegardes de mon dossier Dropbox afin qu'elles correspondent au dossier source, mais cela n'a pas été fait. J'ai donc quelques questions :

  • Par défaut, est-ce que rsync uniquement ajouter vers 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 fichiers qui ont été supprimés du dossier source ?

  • Si c'est le cas, quelle est la meilleure façon de faire rsync faire ça ? I veux que le dossier de destination reflète parfaitement le dossier source, ce qui implique la suppression de tous les fichiers qui ont été supprimés du dossier source.

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

377voto

GarethD Points 3881

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

rsync -avh source/ dest/ --delete

NB : -avh est pour --archive --verbose --human-readable

63voto

shgnInc Points 3073

Die rsync 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 être supprimé.

Je vous suggère d'utiliser rsync pour faire une sauvegarde à partir des fichiers sources et utiliser find ... rm pour la suppression de fichiers pour une période de temps ou une taille de fichiers :

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

Le bloc de code ci-dessus, faire une sauvegarde à partir de la source et puis supprimer tous les fichiers dont le temps de dernière modification sont plus de 2 mois.

UPDATE

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

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

Ça veut dire que :

  1. rsync supprime les fichiers de TARGET qui sont supprimés de SOURCE.
  2. rsync commence à synchroniser les fichiers.

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

Ça veut dire que :

  1. rsync commence à synchroniser les fichiers.
  2. rsync supprime les fichiers de TARGET qui sont supprimés de SOURCE après la synchronisation.

NOTE : Le site --delete-{before/after} mettre en œuvre juste en CIBLE.

9voto

codingdave Points 191

La commande

$ rsync -avhn --delete local/ remote/

prend soin de toujours synchroniser les modifications effectuées localement avec le système distant. Cela signifie qu'il prend soin de synchroniser local y à distance tel que

  1. fichiers ajouté en local sont ajoutés à à distance
  2. fichiers supprimé de local sont retirés de à distance
  3. fichiers ajouté en à distance sont supprimés
  4. fichiers supprimé de à distance sont restaurés à partir de local s'ils existent, sinon ignorés

Les paramètres expliqués :

  • -a mode archive
  • -v augmenter la verbosité
  • -h produire des chiffres dans un format lisible par l'homme
  • -n exécution à sec, effectuez une exécution d'essai sans modification. Utilisez toujours ce drapeau au départ pour éviter la perte de données . Lorsque vous êtes satisfait, retirez-le.

Laissez les résultats parler d'eux-mêmes :

  • Créez 2 répertoires

    $ mkdir local/ remote/
  • Créer des fichiers en leur sein

    $ touch local/local_only remote/remote_only local/exists_locally_and_remotely remote/exists_locally_and_remotely`
  • Voir ce qui a été créé ( avant rsync ) :

    $ ls local/ remote/ 
    
    local/:
    exists_locally_and_remotely  local_only
    
    remote/:
    exists_locally_and_remotely  remote_only
  • en appelant rsync :

    $ rsync -avh --delete local/ remote/
    sending incremental file list
    deleting remote_only
    local_only
    
    sent 160 bytes  received 50 bytes  420.00 bytes/sec
    total size is 0  speedup is 0.00
  • Voir le résultat ( après rsync ) :

    $ ls local/ remote/ 
    
    local/:
    exists_locally_and_remotely  local_only
    
    remote/:
    exists_locally_and_remotely  local_only

Comme vous pouvez le voir, le fichier à distance/à distance_seulement a été supprimé le fichier local/local_only a été synchronisé .

7voto

Ganesh Ghube Points 79

Cette commande copiera les données incrémentales et les gardera en synchronisation avec le serveur distant.

  1. Il ne copiera que les données incrémentielles.
  2. Il supprimera toute donnée supprimée de la source.
  3. Il copiera à nouveau à partir de la source si des données sont supprimées à la destination.
  4. En gros, cette commande permet de synchroniser les deux environnements.

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

5voto

Lonnie Best Points 2012

S'il y a des erreurs pendant un scync rsync, rsync ne supprimera pas correctement les fichiers qu'il aurait dû supprimer, même si vous avez utilisé la commande --delete , --delete-after ou --delete-before .

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

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

--perms est acceptable lorsque vous effectuez une synchronisation d'un système de fichiers Linux vers un autre système de fichiers Linux, mais si vous effectuez une synchronisation de Linux vers un système de fichiers non-Linux (comme NTFS, FAT), --perms provoque des erreurs car rsync ne peut pas définir les permissions Linux sur un système de fichiers non-linux . Encore une fois, erreurs = pas de suppression.

-- Lorsque je synchronise sur une partition non Linux, j'utilise --no-perms pour éviter ces erreurs qui sabotent --delete , --delete-after ou --delete-before .

Si vous obtenez toujours des erreurs après cela, et que vous ne parvenez pas à les faire disparaître, 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 qui ne sont pas synchronisés, mais ne synchronisera aucun fichier. Donc, vous devez vous synchroniser à nouveau après cela. Cette commande est basée sur ceci réponse sauf que j'ai ajouté le --ignore-errors également, de sorte qu'il supprimerait même s'il y a des erreurs.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X