mkdir -p test/a/b/c/d/e
mkdir -p test/dest
rsync -nvraL test/a test/dest --exclude=a/b/c/d
Cela marche. Comme test/a
est le répertoire de base à partir duquel la synchronisation est effectuée, le modèle d'exclusion est spécifié en commençant par a/
Montrez-nous les vrais chemins/exclus si cela ne vous aide pas.
L'exécution de rsync avec -vn répertorie les répertoires/fichiers - le modèle est mis en correspondance avec le format imprimé par rsync.
L'une ou l'autre de ces solutions fonctionnerait :
rsync -nvraL test/a test/dest --exclude=/a/b/c/d
rsync -nvraL test/a/ test/dest --exclude=/b/c/d
Notez la fin /
dans le chemin source fait une différence critique sur la façon dont --exclude
doit être précisé. Cela suppose que nous avons :
mkdir -p test/a/b/c/d/e
mkdir -p test/a/other/place/a/b/c/d
mkdir -p test/dest
La publication d'origine rencontre des difficultés lorsque le chemin d'exclusion commence par un /
. La réponse de Daniel est correcte que ce /
initial dans le chemin d'exclusion peut être souhaitable pour exclure un chemin spécifique, et que ce /
initial doit être compris comme le premier ^
dans les expressions régulières. Cependant, sa réponse a une faute de frappe critique sur la fin /
dans le chemin source.
En suivant l'exemple d'Erik, vous voulez faire ceci :
rsync -nvraL test/a/ test/dest --exclude=/b/c/d
En fait, ni la réponse d'Erik ni d'Antoni n'est entièrement exacte.
Erik a à moitié raison de dire cela
Comme test/a est le répertoire de base à partir duquel la synchronisation est effectuée, le modèle d'exclusion est spécifié en commençant par a/
Il est vrai que la racine du modèle d'exclusion est test/a
(c'est-à-dire le modèle /some/path
se lie à test/a/some/path
), mais ce n'est pas toute l'histoire.
À partir de la page de manuel :
si le motif commence par un / alors il est ancré à un endroit particulier dans la hiérarchie des fichiers, sinon il est mis en correspondance avec la fin du nom de chemin. Ceci est similaire à un ^ de tête dans les expressions régulières. Ainsi "/foo" correspondrait à un fichier nommé "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).
Nous pouvons ignorer le per-directory
peu car cela ne s'applique pas à nous ici.
Par conséquent, rsync -nvraL test/a test/dest --exclude=a/b/c/d
exclura très certainement test/a/b/c/d
(et les enfants), mais cela exclura également test/a/other/place/a/b/c/d
.
rsync -nvraL test/a test/dest --exclude=/b/c/d
, en revanche, exclura uniquement test/a/b/c/d
(et enfants) (test/a
étant le point auquel /
est ancré).
C'est pourquoi vous avez toujours besoin de la barre oblique initiale d'ancrage si vous souhaitez exclure ce chemin spécifique d'être sauvegardé. Cela peut sembler être un détail mineur, et il le sera plus votre modèle d'exclusion sera spécifique (par exemple, Pictures
contre home/daniel/Pictures
) mais il pourrait juste vous mordre les fesses.