Je souhaite rsync uniquement certains types de fichiers (par exemple .py
) et je veux exclure des fichiers dans certains répertoires (par exemple venv
).
Voici ce que j'ai essayé:
rsync -avz --include='*/' --exclude='venv/' --include='*.py' --exclude='*' /tmp/src/ /tmp/dest/
Mais ça ne marche pas.
Qu'est-ce que je rate?
J'ai également suivi la réponse à cette question, mais cela n'a pas aidé.
--include='*/'
?Réponses:
venv/
doit être exclu avant d'*/
être inclus:La subtilité est que
rsync
les règles sont traitées dans l'ordre et la première règle correspondante gagne. Donc, si--include='*/'
c'est avant--exclude='venv/'
, le répertoirevenv/
est inclus par--include='*/'
et la règle d'exclusion n'est jamais consultée.Pouvons-nous simplifier cela?
La valeur par défaut est d'inclure des fichiers / répertoires. Considérez donc:
Cela comprendrait tout sauf les fichiers ou répertoires sous
venv/
. Cependant, vous ne voulez que des.py
fichiers. Cela signifie que nous devons explicitement exclure les autres fichiers avec--exclude='*'
.--exclude='*'
exclut les fichiers et les répertoires. Donc, si nous spécifions--exclude='*'
, tous les répertoires seraient exclus et seuls les.py
fichiers dans le répertoire racine seraient trouvés..py
les fichiers dans les sous-répertoires ne seraient jamais trouvés carrsync
ne regardent pas dans les répertoires qui sont exclus. Ainsi, si nous l'avons--exclude='*'
, nous devons le précéder de--include='*/'
pour nous assurer que le contenu de tous les répertoires est exploré.la source
--include='*/'
et--exclude='*'
? Pourquoi seulement--exclude=venv/ --include='*.py'
ne fonctionne pas?