web-dev-qa-db-fra.com

Comment rsync des fichiers avec un motif correspondant dans le chemin en gardant la structure du répertoire intacte?

Je veux copier tous les fichiers du serveur A vers le serveur B qui ont le même nom de répertoire parent à différents niveaux de la hiérarchie du système de fichiers, par exemple:

/var/lib/data/sub1/sub2/commonname/filetobecopied.foo
/var/lib/data/sub1/sub3/commonname/filetobecopied.foo
/var/lib/data/sub2/sub4/commonname/anotherfiletobecopied.foo
/var/lib/data/sub3/sub4/differentname/fileNOTtobecopied.foo

Je veux copier les trois premiers fichiers qui ont tous le chemin d'accès commonname vers le serveur B. J'ai déjà passé beaucoup de temps à trouver les bons motifs d'inclusion/exclusion pour rsync mais je ne reçois pas il. La commande suivante ne fonctionne pas:

rsync -a --include='**/commonname/*.foo' --exclude='*' [email protected]:/var/lib/data /var/lib/data

Je correspond trop ou à peu de fichiers. Comment puis-je synchroniser uniquement les fichiers avec le commonname sur son chemin?

19
murks

Je suppose que vous cherchez ceci:

rsync -a -m --include='**/commonname/*.foo' --include='*/' --exclude='*' [email protected]:/var/lib/data /var/lib/data

Il y a 2 différences avec votre commande:

  • Le plus important est --include='*/'. Sans cela, comme vous l'avez spécifié --exclude='*', rsync n'entrera jamais dans les sous-répertoires, car tout est exclu. Avec --include='*/', les sous-répertoires ne sont plus exclus, donc rsync peut joyeusement reprendre.
  • Le moins important est -m: cela élague les répertoires vides. Sans cela, vous obtiendrez également le sous-répertoire (vide) /var/lib/data/sub3/sub4/differentname/ copié.
35
gniourf_gniourf