Le répertoire d'exclusion rsync ne fonctionne pas


34

J'utilise Fedora 17 64 bits et rsync --exclude=/home/ben/<dir>ne fonctionne pas comme prévu.

J'essaie de rsyncmon répertoire personnel vers une clé USB, mais je veux exclure certainement les répertoires contenant des fichiers de cache et des fichiers de construction. C'est la commande que j'utilise:

rsync --exclude=/home/ben/build/ --exclude=/home/ben/.ccache -arv /home/ben home-ben/

Cependant, le contenu de ~/buildet ~/.ccacheest en cours de copie par rsync. Qu'est-ce que je fais mal?


1
Je pense que les modèles d'exclusion ne fonctionnent tout simplement pas.
Sören

Réponses:


37

Les rsyncrègles de filtrage globales commençant par un interligne /sont ancrées à la racine du transfert. Citant la section "INCLUDE / EXCLUDE PATTERN RULES" de la page de manuel:

si le motif commence par un /, il est ancré à un emplacement particulier dans la hiérarchie des fichiers, sinon il correspond à la fin du chemin. Ceci est similaire à un ^ majeur dans les expressions régulières. Ainsi, "/ foo" correspondrait à un nom "foo" à la "racine du transfert" (pour une règle globale) ou dans le répertoire du fichier de fusion (pour une règle par répertoire).

Dans votre commande ( rsync ... -arv /home/ben home-ben/), le fichier /home/ben/fooserait transféré à home-ben/ben/foo. La racine du transfert est home-benet le chemin de filtre correct est /ben/foo. Ainsi,

  • pour correspondre /home/ben/.ccachevous avez besoin d'un chemin de filtre de/ben/.ccache
  • pour correspondre /home/ben/build/vous avez besoin d'un chemin de filtre de/ben/build/

Vous trouverez une explication plus détaillée dans la section "ANCRAGE INCLUANT / EXCLUER LES MOTIFS" de la rsync(1)page de manuel .


Notez que le /fait de ne pas laisser passer le premier n’est pas nécessairement ce que vous voulez. Citant encore de la même section de page de manuel:

Un "foo" non qualifié correspondrait au nom "foo" n'importe où dans l'arborescence, car l'algorithme est appliqué de manière récursive de haut en bas; il se comporte comme si chaque composant du chemin devenait la fin du nom de fichier. Même le "sous / toto" non ancré peut correspondre à n'importe quel point de la hiérarchie où un "toto" a été trouvé dans un répertoire nommé "sous". Reportez-vous à la section ANCRAGE DES MOTIFS INCLUDE / EXCLU pour une discussion détaillée sur la manière de spécifier un modèle qui correspond à la racine du transfert.

Ainsi, un modèle de filtre de build/correspondrait à un répertoire de construction n'importe où /home/ben, même /home/ben/many/sub/directories/build/.


2
Le détail clé est que les slash sont importants. Si vous ajoutez une barre oblique à la fin du répertoire source (rsync -a source / destination), le contenu de la source sera copié. Sinon, rsync -a source destinationle répertoire source est copié dans la destination. Cela détermine quelle sera la racine du transfert afin d'informer l'expression à exclure. L'utilisation correcte de / dans l'expression d'exclusion est ensuite expliquée ci-dessus. Notez en particulier que rsync --exclude='/dir1' source destinationrien n'exclut.
Pgoetz

11

Je pense que vos excludechemins doivent être relatifs au chemin source. Pouvez-vous essayer cela à la place?

rsync --exclude=build/ --exclude=.ccache -arv /home/ben home-ben/

Voici un test, à titre de comparaison:

/tmp$ tree src dest
src
├── a
└── b
dest
└── foo/

/tmp$ rsync -nav --exclude /tmp/src/b /tmp/src /tmp/dest
sending incremental file list
src/
src/a
src/b

$ rsync -nav --exclude b /tmp/src /tmp/dest
sending incremental file list
src/
src/a

2
Cette réponse est fausse. Avec un chemin d'exclusion relatif, vous excluriez le motif partout!
rubo77

Ce post est correct. La correspondance est basée sur le texte et non sur le fichier inode. Quel que soit le chemin indiqué dans la sortie de la --verbosecommande, c'est le format que vous devez utiliser.
Sridhar Sarnobat

Cela a fonctionné pour moi.
Zhenyu

Que faire si le chemin source est '/' alors absolu sont les chemins relatifs, mais cela ne fonctionne toujours pas.
Sören

C'est la seule chose qui a fonctionné pour moi.
Jonathan

2

J'ai eu ce problème dans un script (je ne sais pas si c'est votre cas). J'étais parce que j'ai utilisé cette commande dans un script et que j'utilisais sh au lieu de bash. vérifiez le shebang au début de votre script.


1

Votre modèle d'exclusion fonctionnerait si vous synchronisez le chemin d'accès complet / home, c'est-à-dire sans barre oblique finale:

rsync --exclude=/home/ben/build/ --exclude=/home/ben/.ccache -arv /home home-all/

Mais mieux vaut seulement rsync le contenu du dossier avec un slash de fin:

rsync --exclude=/build --exclude=/.ccache -arv /home/ben/ home-ben/

Vous pouvez aussi utiliser une liste ignore, voir: https://askubuntu.com/questions/545655/backup-your-home-directory-with-rsync-and-skip-useless-folders


0

Pour exclure un dossier spécifique avec rsync, vous devez considérer le chemin relatif dans la commande. dans votre cas:

rsync --exclude=/ben/build/ --exclude=/ben/.ccache -arv /home/ben home-ben/

où "ben" est le dossier que vous synchronisez

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.