Rsync: exclure une arborescence sauf un sous-répertoire

Bonjour,

malgré la lecture et relecture des règles d’exclusion/inclusion et de nombreux tests avec «+», «-», «–exclude-from», «–include-from» dans diverses combinaisons, je ne parviens pas à obtenir que
rsync exclut de la sauvergarde le répertoire /dir1/ sauf son sous-répertoire /dir1/subdir3/,
dans cet exemple:
source:

/dir1/subdir1/
/dir1/subdir2/
/dir1/subdir3/
/dir2/subdir21/
/dir2/dubdir22/

cible attendue:

/dir1/subdir3/
/dir2/subdir21/
/dir2/dubdir22/

Quel est donc la syntaxe pour obtenir ce résultat (dans un script)?

Par exemple dans une commande:
rsync -au --exclude-from=exclude.txt source/ cible/

bonjour,

rsync -av /repertoireDepart/ /repertoireArrivee/ --exclude="repertoireExclu"

mettre autant d’exclude que necessaire

Cdt

Merci fech,
mettre autant d’exclus que nécessaire, c’est ce que je fais depuis longtemps.
L’idée était simplement de raccourcir le fichier exclude.file ou de l’associer à --include-file, par exemple (ou -include) afin d’oublier les nouveaux sous-répertoires nouvellement créés, et qui n’ont pas à être sauvegardés.

salut
j’ai réussi en mettant l’exclude en relatif
exclude=bb/a1/c1
cd /tmp/aa; /usr/bin/rsync -r -t -p -o -g -v --progress --delete -l -s --exclude=bb/a1/c1 --include=/tmp/aa/bb/a1/* /tmp/aa/bb /tmp/aa/cc/ : le dossier /tmp/aa/bb/a1/c1 n’est pas copié ; le dossier /tmp/aa/bb/a1/c2 est copié

exclude=/tmp/aa/bb/a1/c1
/usr/bin/rsync -r -t -p -o -g -v --progress --delete -l -s --exclude=/tmp/aa/bb/a1/c1 --include=/tmp/aa/bb/a1/* /tmp/aa/bb /tmp/aa/cc/ : le dossier /tmp/aa/bb/a1/c1 est quand même copié ; le dossier /tmp/aa/bb/a1/c2 est copié

Merci dindoun,
mais ( si je comprends bien ) cela revient encore à exclure 1 par 1 les sous-répertoires de /a1/ (ici /a1/c1/ seulement) pour ne laisser que a1/c2/ hors des exclusions.
Ma question est l’inverse: comment tout exclure de /a1/ (/a1/c1/, /a1/c3, /a1/c4 etc.) en indiquant seulement d’exclure le répertoire racine (/a1/), et copier quand-même 1 répertoire (ici /a1/c2).
Il s’agirait juste d’éviter d’ établir la liste des sous-répertoires de /a1/ à exclure.

J’espérais qu’en ajoutant un «include» (/a1/c2/) avant ou après la commande «exclude» (/a1/), cette solution fonctionnerait, mais je n’ai pas réussi.
Bien entendu, ces directives doivent se trouver dans un fichier du type --exclude-from ou --files-from

Si c’est dans un script, tu crées 2 rsync et tu ne te casses pas la tête …

ok j’ai compris :
l’idée est d’autoriser les dossiers et d’exclure les sous-dossiers et de tout passer par filter

je mets tes dossiers dans /tmp/aa/ , je copie dans /tmp/bb/

  • premier essai :
    rsync -aA -H --numeric-ids -v --progress --delete --filter="merge /tmp/merge.txt" /tmp/aa/ /tmp/bb/
    avec merge.txt :
+ dir1/
+ dir2/
- dir1/subdir1/
- dir1/subdir2/

$ find /tmp/bb/* -mindepth 1 |sed 's#/tmp/bb/##'
dir1/subdir3
dir2/subdir21
dir2/dubdir22

effectivement, il faux être pratique.
mais c’est ma tendance Shadock à penser compliqué ce qui peut aisément se contourner.
Merci pour ce paradoxe métaphorique: me faire toucher le sol en m’allégeant.

non, l’idée est d’interdire un dossier avec tous ses sous-dossiers, sauf un, afin de n’avoir pas à tous les lister sauf un.

Ici encore, il faut lister…

Mais la solution pratique est effectivement de ne pas se casser la tête en faisant simplement 2 rsync:

  • dans le premier on exclut tout
  • dans le deuxième on ne copie que le sous-dossier choisi.

Merci pour vos efforts

peut être avec
+ /machin
- /machin
+ /machin/truc
mais j’ai la flemme d’essayer

oui, il est temps de renoncer: trop casse-tête c’est aussi trop périlleux, et la solution pratique est simple, comme l’a souligné PmGs.

encore merci à tous