web-dev-qa-db-fra.com

Comment rsync plusieurs dossiers source

Je veux rsync plusieurs sources et je me demande la meilleure façon d'y parvenir.

par exemple.

/etc/fstab
/home/user/download

J'ai pensé à 3 solutions:

  • Solution 1

appel multiple à rsync

rsync -a /etc/fstab bkp
rsync -a /home/user/download bkp

con: plus difficile d'avoir des statistiques agrégées

  • Solution 2

créez un dossier tobackup contenant un lien symbolique et utilisez -L options

sync -aL /home/user/tobackup bkp

con: le contenu à sauvegarder ne doit pas contenir de liens symboliques

  • Solution 3

déplacer les fichiers vers la sauvegarde et créer un lien symbolique à l'emplacement d'origine

rsync -a /home/user/tobackup bkp

con: quelques config manuelles

Lequel recommandez-vous ?

Y a-t-il une meilleure façon?

39
user1437346

Vous pouvez passer plusieurs arguments source.

rsync -a /etc/fstab /home/user/download bkp

Cela crée bkp/fstab et bkp/download, comme les commandes séparées que vous avez données. Il peut être souhaitable de conserver la structure source à la place. Pour ce faire, utilisez / comme source et utilisez règles d'inclusion-exclusion pour spécifier les fichiers à copier. Il y a deux façons de faire ça:

  • Incluez explicitement chaque fichier ainsi que chaque composant de répertoire qui y mène, avec /*** à la fin des répertoires lorsque vous souhaitez copier toute l'arborescence des répertoires:

    rsync -a \
        --include=/etc --include=/etc/fstab \
        --include=/home --include=/home/user --include='/home/user/download/***' \
        --exclude='*' / bkp
    
  • Inclure tous les répertoires de niveau supérieur avec /*/ (pour que rsync traverse /etc et /home lors de la recherche de fichiers à copier) et des répertoires de second niveau avec /*/*/ (pour /home/user), mais supprimez les répertoires dans lesquels aucun fichier n'est copié. C'est plus pratique car vous n'avez pas besoin de lister explicitement les parents. Vous pouvez même utiliser --Prune-empty-dirs --include='*/' au lieu de compter le nombre de niveaux, mais cela n'est pas pratique ici car rsync traverserait tout le système de fichiers pour explorer les répertoires même si aucune des règles d'inclusion ne peut correspondre à quelque chose en dehors de /etc et /home/user/download.

    rsync -a --Prune-empty-dirs \
        --include='/*/' --include='/*/*/' \
        --include=/etc/fstab \
        --include='/home/user/download/***' \
        --exclude='*' / bkp
    

J'aime vraiment la réponse de Gilles, cependant, je voudrais ajouter qu'à mon avis, il est préférable de synchroniser plusieurs dossiers tout en préservant la structure du répertoire en passant plusieurs arguments source en conjonction avec le --relative option.

Dans ce cas, nous pourrions avoir quelque chose comme suit:

rsync -aR /etc/fstab /home/user/download bkp

ce qui entraînerait bkp/etc/fstab et bkp/home/user/download.

La meilleure partie à ce sujet est que (je crois que depuis rsync v. 2.6.7), nous pouvons essentiellement contrôler la quantité de la structure de répertoires que nous voulons répliquer sur le récepteur.
(Voir la documentation sur le --relative option ici )

Donc par exemple si on faisait ça

rsync -aR /home/./user1/download /home/./user2/download bkp

nous finirions avec bkp/user1/download et bkp/user2/download.

17
Christoph

Cela fonctionne également - accolades, contenant une liste de sources séparées par des virgules.

rsync -vap --progress --stats root@server:{/etc,/root/backups,/home/ultralazer} /mnt/bigdrive

Un peu similaire à ce qui se passe lorsque vous invoquez des accolades sytnax avec cp et certains autres utilitaires:

cp -vr /etc /root/backups /home/{ultralazer,zerocool} /mnt/bigdrive
3
Brad Hein