web-dev-qa-db-fra.com

Copier rsync sur certains types de fichiers uniquement à l'aide de l'option include

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 $ à 
76
user881480

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

133
chepner

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"
40
WanderingMind

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.

13
Serge Roussak

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:

  • Ne correspondant à aucun modèle signifie qu'un fichier sera copié!
  • L'algorithme se ferme une fois que n'importe quel motif correspond

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"
  1. Ne sautez aucun répertoire
  2. Ne sautez aucun .sh des dossiers
  3. Passer tout
  4. (Implicitement, ne sautez rien, mais la règle ci-dessus empêche la règle par défaut de se produire.)

Finalement, le --Prune-empty-directories empêche la première règle de créer des répertoires vides partout.

6
Jim Hunziker