J'utilise le script bash suivant pour copier uniquement les fichiers d'une certaine extension (dans ce cas, * .sh). Toutefois, il copie toujours tous les fichiers. Qu'est-ce qui ne va pas?
de = 1 $ à = 2 $ rsync -zarv --include = "*. sh" $ de $ à
Je pense --include
est utilisé pour inclure un sous-ensemble de fichiers qui sont autrement exclus par --exclude
, plutôt que d'inclure uniquement ces fichiers. En d'autres termes: vous devez penser à include ce qui signifie ne pas exclure .
Essayez plutôt:
rsync -zarv --include "*/" --exclude="*" --include="*.sh" "$from" "$to"
Pour rsync version 3.0.6 ou supérieure, l'ordre doit être modifié comme suit (voir commentaires):
rsync -zarv --include="*/" --include="*.sh" --exclude="*" "$from" "$to"
Ajout du -m
flag empêchera la création de structures de répertoires vides dans la destination. Testé en version 3.1.2.
Donc, si nous ne voulons que des fichiers * .sh, nous devons exclure tous les fichiers --exclude="*"
, inclure tous les répertoires --include="*/"
et inclure tous les fichiers * .sh --include="*.sh"
.
Vous pouvez trouver de bons exemples dans la section Inclure/Exclure les règles de modèle de la page de manuel
La réponse de @chepner copiera tous les sous-répertoires indépendamment du fait qu’ils contiennent ou non le fichier. Si vous avez besoin d’exclure les sous-répertoires qui ne contiennent pas le fichier tout en conservant la structure de répertoires, utilisez
rsync -zarv --Prune-empty-dirs --include "*/" --include="*.sh" --exclude="*" "$from" "$to"
Encore un ajout: si vous avez besoin de synchroniser des fichiers avec ses extensions dans n seul répertoire (sans récursion), vous devez utiliser une construction comme celle-ci:
rsync -auzv --include './' --include '.ext' --exclude '*' /source/dir/ /destination/dir/
Portez votre attention sur le point dans le premier --include
. --no-r
ne fonctionne pas dans cette construction.
Voici la partie importante de la page de manuel:
Au fur et à mesure que la liste des fichiers/répertoires à transférer est construite, rsync vérifie tour à tour chaque nom à transférer avec la liste des modèles d'inclusion/exclusion, et le premier modèle correspondant est traité: s'il s'agit d'un modèle d'exclusion, alors ce fichier est sauté; s'il s'agit d'un modèle d'inclusion, le nom de fichier n'est pas ignoré; si aucun motif correspondant n'est trouvé, le nom du fichier n'est pas ignoré.
Résumer:
De plus, quelque chose se terminant par une barre oblique correspond aux répertoires correspondants (comme find -type d
aurait).
Séparons cette réponse par le haut.
rsync -zarv --Prune-empty-dirs --include "*/" --include="*.sh" --exclude="*" "$from" "$to"
.sh
des dossiersFinalement, le --Prune-empty-directories
empêche la première règle de créer des répertoires vides partout.