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é.