Je souhaite synchroniser 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é.
Réponse acceptée :
venv/
doit être exclu avant */
est inclus :
rsync -avz --exclude='venv/' --include='*/' --include='*.py' --exclude='*' /tmp/src/ /tmp/dest/
La subtilité est que rsync
traite les règles dans l'ordre et la première règle correspondante l'emporte. Donc, si --include='*/'
est avant --exclude='venv/'
, puis le répertoire venv/
est inclus par --include='*/'
et la règle d'exclusion n'est jamais consultée.
Pourrions-nous simplifier cela ?
Pourquoi avons-nous besoin de
--include='*/'
et--exclude='*'
? Pourquoi--exclude=venv/ --include='*.py'
n'est-il pas suffisant ?
La valeur par défaut est d'inclure les fichiers/répertoires. Alors, considérez :
rsync -avz --exclude='venv/' --include='*.py' source target
Cela inclurait tout sauf les fichiers ou répertoires sous venv/
. Cependant, vous ne voulez que .py
des dossiers. Cela signifie que nous devons explicitement exclure d'autres fichiers avec --exclude='*'
.
--exclude='*'
exclut les deux fichiers et répertoires. Donc, si nous spécifions --exclude='*'
, alors tous les répertoires seraient exclus et seul le .py
le fichier le répertoire racine serait trouvé. .py
les fichiers dans les sous-répertoires ne seraient jamais trouvés car rsync
ne regarde pas dans les répertoires qui sont exclus. Ainsi, si nous avons --exclude='*'
, nous devons le faire précéder de --include='*/'
pour s'assurer que le contenu de tous les répertoires est exploré.