Comment exclure plusieurs annuaires avec rsync?

184

J'essaie de sauvegarder mon répertoire personnel à l'aide de rsync et je souhaite exclure certains des répertoires contenant des fichiers indésirables. Je veux exclure spécifiquement /home/ben/.ccacheet /home/ben/build. Malheureusement, la documentation pour rsync était une surcharge d'informations et n'a pas répondu à ma question. C'est ce que j'ai essayé:

rsync -arv --exclude "/home/ben/.ccache:/home/ben/build" /home/ben /media/ben/thumbdrive/

Quel est le bon moyen de le faire?

Freedom_Ben
la source
4
Je voulais juste dire que le drapeau aimplique rdéjà :)-a, --archive archive mode; equals -rlptgoD (no -H,-A,-X)
Populus

Réponses:

238

OK je me sens vraiment bête. Avant même de poster cette question, mon ami m'a montré comment le faire et c'est très simple. Pour exclure plusieurs répertoires, utilisez simplement plusieurs --exclude=pathcommutateurs. Donc, ma commande ci-dessus correctement écrite est la suivante:

rsync -arv --exclude=.ccache --exclude=build /home/ben /media/ben/thumbdrive/
Freedom_Ben
la source
7
Un chemin absolu ne fonctionnait pas pour moi (le répertoire spécifié n'était pas exclu en mode silencieux), alors qu'un chemin relatif au répertoire source fonctionnait correctement. Peut-être me manque quelque chose, mais je serais prudent sur l'affirmation de @FreeSoftwareServers que les chemins absolus fonctionnent toujours.
Soren Bjornstad
5
FYI: L'option -ainclut -rdonc -arest redondant.
David
4
Contrairement à ce que FreeSoftwareServers pense, le chemin d'exclusion est relatif au chemin source, PAS /. Donc, ce commentaire est catégoriquement faux et conduira à des échecs si vous le suivez. La meilleure stratégie consiste à ne pas insérer les caractères principaux / dans vos exclus pour éviter ce type d'erreur mentale. Si source est dit, / home / me et si vous excluez = '/ mydir /', le répertoire mydir dans / home / me est exclu, c'est-à-dire qu'il exclut / home / moi / mydir NOT / mydir / at /. Il est regrettable que je ne puisse ni sous-estimer ni modifier ce commentaire car il est techniquement faux et risque d'induire en erreur.
Lizardx
3
Pour votre information ultérieure, il semble que le commentaire en question de @FreeSoftwareServer ait été supprimé. tl; dr: utilise les chemins relatifs
Freedom_Ben
2
Si vous êtes bête, moi aussi et moi, 179 autres votants!
Sridhar Sarnobat
108

Lorsque vous devez exclure plusieurs répertoires et / ou fichiers, créez un fichier texte et utilisez le --exclude-fromcommutateur. Créez un fichier appelé exclude_me.txtdans lequel sont répertoriées vos exclusions. Exemple ( /home/ben/exclude_me.txt):

.ccache
build
.java
.gvfs
.xsession-errors

Ensuite, votre rsync ressemblerait à ceci:

rsync -arv --exclude-from='/home/ben/exclude_me.txt' /home/ben /media/ben/thumbdrive/

Voici quelques informations sur les règles de filtrage qui peuvent aider:

  • /dir/ signifie exclure le dossier racine /dir
  • /dir/*signifie obtenir le dossier racine /dirmais pas le contenu
  • dir/ signifie exclure n'importe quel dossier où le nom contient dir/

  • Exemples exclus: /dir/, /usr/share/directory/, /var/spool/dir/ /var/spool/lpd/cfsignifie ignorer les fichiers commençant par cfn'importe quel dossier dans/var/spool/lpd

Reportez-vous également à la section relative aux règles de filtrage de la page de manuel.

utilisateur228759
la source
4
Il est important de noter que le dossier racine signifie la racine du transfert et non le répertoire racine.
jamesdlin
C'est une réponse brillante!
Alexandre Joukov
85

Vous pouvez également exclure plusieurs chemins entre accolades:

rsync -arv --exclude={.ccache,build} /home/ben /media/ben/thumbdrive/
György Ráth
la source
40
ça marche bien, mais pas sous sh, seulement sous bash, j'ai découvert "à la dure"
xor
7
Pas d'espace après la virgule. J'ai appris ça à la dure aussi 😭
styl3r
Et n'utilisez pas "comme" --exclude = ". Gvfs"
Martin T.
FWIW, je pense que les accolades fonctionnent avec ksh. Pour d' autres coquilles, vous pouvez probablement utiliser quelque chose comme: IFS=$'\n'; rsync -arv $(printf '.ccache\nbuild\n' | sed 's/^/--exclude=/g') /home/ben /media/ben/thumbdrive/. Vous pouvez également utiliser plusieurs --excludearguments que vous devez taper manuellement.
TSJNachos117 le
1
Cela fonctionne parce que "Brace Expansion", au cas où quelqu'un voudrait regarder les détails.
shredalert le