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:
appel multiple à rsync
rsync -a /etc/fstab bkp
rsync -a /home/user/download bkp
con: plus difficile d'avoir des statistiques agrégées
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
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?
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
.
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