Dans un rsync, comment exclure tous les répertoires qui correspondent à un modèle?

8

Dans un rsync, j'essaie d'exclure des sous-répertoires qui correspondent à un modèle. Mais, je ne peux pas le faire fonctionner. J'ai suivi plusieurs exemples trouvés ici et sur Google. Mais je n'obtiens pas les bons résultats. Voici le bit d'option de ma commande:

-avh --exclude 'branch*' --stats --delete --link-dest=$LNK

Ma structure de répertoire source est

/root
    /branch1
    /branch2
    /branch3
    /other
    /stillAnother
    /etc

Cela fait partie d'un script de sauvegarde. $ LNK est un lien vers la destination rsync de la veille.

Je ne veux pas / root / branch1, / root / branch2, / root / branch3. ou leur contenu à synchroniser. Mais ils sont.

Voici les bits d'exclusion que j'ai déjà essayés:

--exclude=branch*
--exclude='branch*'
--exclude '/branch*'
--exclude /branch*

Merci pour toute aide / conseil.

EDIT - pour résoudre le drapeau "possible en double"

Cette question concerne une liste connue de répertoires. Je dois exclure tous les répertoires qui suivent un modèle, même si ces répertoires n'existent pas encore. c'est à dire de mon exemple, d'autres répertoires nommés /branch*peuvent être ajoutés. J'ai besoin de rendre mon script évolutif et d'éviter de modifier le script lorsqu'un répertoire correspondant au modèle est ajouté, car ces répertoires peuvent être temporaires.

Roger Creasy
la source
votre paramètre d'exclusion est correct. Si rsync ignore la branche * lors de la copie, il l'ignore également lors de la suppression de dest, vous devez donc supprimer manuellement ces répertoires à destination une fois.
Ipor Sircer du
la destination est un nouveau répertoire vide, créé par mon script bash. J'ai supprimé les répertoires branch * du répertoire link-dest, en vain.
Roger Creasy
1
Vous devez utiliser un modèle complet explicite comme *branch*ou /root/branch*non la forme courte branch*- courte n'est pas trouvée et n'est donc pas exclue.
Kondybas
@Kondybas Donc, tout va bien dans mes options sauf que je dois ajouter un '*' à ma branche d'exclusion? ( --exclude '*branch*)
Roger Creasy

Réponses:

2

Vous excluez la règle est correcte. Cependant, rsync ne supprimera pas les fichiers exclus sur la destination sans le paramètre supplémentaire --delete-excluded:

--delete-excluded also delete excluded files from dest dirs

Exemple:

#  tree test
test
|-- 123
|-- branch1
|-- branch2
|-- branch3
`-- other

#  tree test2
test2
|-- 123
|-- branch1
|-- branch2
|-- branch3
`-- other

# rsync -avh test/ test2 --delete --exclude='branch1' --delete-excluded
sending incremental file list
deleting branch1/

sent 140 bytes  received 27 bytes  334.00 bytes/sec
total size is 0  speedup is 0.00

#  tree test2
test2
|-- 123
|-- branch2
|-- branch3
`-- other

3 directories, 1 file
M. Glatki
la source
J'ai changé mes options dans le script en -avh --exclude 'branch*' --stats --delete --delete-excluded --link-dest=$LNKsauvegarde de la nuit dernière toujours sauvegardé les répertoires / branch *.
Roger Creasy
1

rsync version 3.1.3 (peut-être plus tôt, n'a pas été vérifié) exclut correctement les sous-répertoires utilisant cette syntaxe (en remplaçant évidemment exclude_dirnamepar le modèle que vous souhaitez exclure):

rsync [other opts...] --exclude='*/exclude_dirname/' /src/ /dst/

Cela fonctionne également avec les caractères génériques. La question d'origine utilise 'branch*', donc cela fonctionne:

rsync [other opts...] --exclude='*/branch*/' /src/ /dst/

J'espère que cela t'aides.

AaronDanielson
la source