Complexe inclus / exclut avec rsync

14

J'essaie de travailler sur la syntaxe du filtre rsync pour effectuer des inclusions / exclusions complexes, et j'essaye d'obtenir les résultats suivants:

Include /
Exclude /home
Include /home/user1/*
Include /home/user2/subdir/*

J'ai essayé de nombreuses variantes de la syntaxe du filtre, et malgré la lecture de la page de manuel plusieurs fois, je ne peux pas obtenir ce genre d'effet. Les filtres Rsync semblent être très puissants, et j'ai du mal à croire qu'ils ne pouvaient pas gérer un scénario commun comme celui-ci.

brianmathis
la source

Réponses:

17

Vous devez inclure tous les répertoires parents jusqu'au répertoire souhaité avant d'utiliser la règle d'exclusion.

Par exemple, j'utilise ce qui suit dans un script de sauvegarde:

rsync -av \ 
--filter='+ /var/' \
--filter='+ /var/backups/' \
--filter='- /var/*' \
/ \
$DEST

Donc, dans votre cas, vous auriez besoin de quelque chose comme ceci:

rsync -av \ 
--filter='+ /home/' \
--filter='+ /home/user1/' \
--filter='+ /home/user2/' \
--filter='+ /home/user2/subdir/' \
--filter='- /home/user2/*' \
--filter='- /home/*' \
/ \
$DEST
Shane Meyers
la source
Excellent. Ça m'a pris du temps.
yclian du
D'une certaine manière, quand j'ai lu le man rsync, j'ai mal compris le bon ordre de mixage inclut et exclut. Il m'a fallu une heure pour le comprendre ...
Adam Ryczkowski
6

Sur la ligne de commande:

rsync --dry-run --verbose --recursive --include=/home/user1 --exclude=/home/* / DEST

Supprimez-le --dry-runpour le rendre fonctionnel, remplacez "DEST" par votre destination et ajoutez l'utilisateur et l'hôte à la source "/" si nécessaire.

À partir d'un fichier de règles:

rsync --dry-run --verbose --recursive --filter='merge /etc/rsync/somerules.rules' / DEST

où le contenu de /etc/rsync/somerules.rulespourrait être:

+/ /home/user1
-/ /home/*

Vous devriez les tester et vous devrez peut-être faire quelques ajustements, mais cela devrait vous aider à démarrer.

En pause jusqu'à nouvel ordre.
la source
OK, ça marche. J'ai un cas plus complexe que j'ai ajouté à la question. L'inclusion supplémentaire ne fonctionne pas avec le scénario subdir.
brianmathis