Le répertoire dexclusion rsync ne fonctionne pas

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

Jessaye de rsync mon répertoire personnel sur une clé USB, mais je veux certainement exclure les répertoires qui contiennent des fichiers de cache et des fichiers de construction. Cest la commande que je « m utilise:

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

Cependant, le contenu de ~/build et ~/.ccache est en cours de copie par rsync. Que fais-je mal?

Commentaires

  • Je pense quexclure les modèles ne fonctionne pas '.

Réponse

Les règles de filtrage rsync globales commençant par un / sont ancrées à la racine de transfert. Citant la section « INCLUDE / EXCLUDE PATTERN RULES » de la page de manuel:

si le modèle commence par un / alors il est ancré à un endroit particulier dans la hiérarchie des fichiers, sinon il correspond à la fin du chemin. Ceci est similaire à un ^ au début des expressions régulières. Ainsi « / foo » correspondrait au nom « foo » à la racine « du transfer « (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/foo serait transféré vers home-ben/ben/foo. La racine du transfert est home-ben et le chemin du filtre correct est /ben/foo. Ainsi,

  • pour correspondre à /home/ben/.ccache vous avez besoin dun chemin de filtre de /ben/.ccache
  • pour correspondre à /home/ben/build/, vous avez besoin dun chemin de filtre de /ben/build/

Une explication plus détaillée peut être trouvé dans la section « ANCRAGE INCLURE / EXCLURE DES MODÈLES » de la page de manuel rsync(1) .


Notez que simplement laisser de côté le / nest pas nécessairement ce que vous voulez. Citant à nouveau la même section de la page de manuel:

Un « foo » non qualifié correspondrait au nom « foo » nimporte où dans larborescence car lalgorithme est appliqué récursivement de haut en bas; il se comporte comme si chaque composant de chemin obtenait un tour dêtre la fin du nom de fichier. Même le « sub / foo » non ancré correspondrait à nimporte quel point de la hiérarchie où un « foo » a été trouvé dans un répertoire nommé « sub ». Consultez la section ANCRAGE DES MOTIFS INCLURE / EXCLURE pour une discussion complète sur la façon de spécifier un motif qui correspond à la racine du transfert.

Ainsi, un modèle de filtre de build/ correspondrait à un répertoire de construction nimporte où dans /home/ben, voire /home/ben/many/sub/directories/build/.

Commentaires

  • Le détail clé est que les barres obliques comptent . Si vous ajoutez une barre oblique à la fin du répertoire source (rsync -a source / destination), il copiera le contenu de la source, sinon rsync -a source destination copie le répertoire source lui-même vers la destination. Cela détermine la racine du transfert afin dinformer lexpression dexclusion. Lutilisation correcte de / dans lexpression dexclusion est ensuite expliquée ci-dessus. Notez en particulier que rsync --exclude='/dir1' source destination na ' exclu rien.

Réponse

AVERTISSEMENT: Par le commentaire de @ rubo77 « ci-dessous , cette réponse ne doit être utilisée que si vous êtes prêt à exclure ces éléments partout dans votre arborescence source, pas seulement à la racine. Voir la réponse de @ jw013 « ci-dessus pour une explication plus approfondie.

Je pense que vos chemins exclude doivent être relatifs au chemin source. Peut essayez-vous plutôt ceci?

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 

Commentaires

  • Cette réponse est fausse. Avec un chemin dexclusion relatif, vous excluriez le modèle partout!
  • Ce message est correct. La correspondance est basée sur du texte et non sur des inodes de fichier. Quel que soit le chemin indiqué par la sortie de la commande --verbose, cest le format que vous devez utiliser.
  • Cela a fonctionné pour moi.
  • Et si le le chemin source est ' / ' alors absolus sont les chemins relatifs, mais ce nest toujours pas le cas ' ça marche.
  • Cest la seule chose qui a fonctionné pour moi.

Réponse

Votre modèle dexclusion fonctionnerait, si vous resynchronisez le chemin entier / home iesans barre oblique à la fin:

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

Mais mieux vaut uniquement rsynchroniser le contenu du dossier avec une barre oblique à la fin:

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

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

Réponse

Jai eu ce problème dans un script (je ne sais pas si cest votre cas). Jétais parce que jai utilisé cette commande dans un script et que jutilisais sh au lieu de bash. vérifiez le shebang au début de votre script.

Commentaires

  • Comment le choix du shell de linterpréteur de shell causerait-il ce problème particulier?

Réponse

Afin dexclure 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

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *