Rsync ne parle pas le regex. Vous pouvez faire appel à find et grep, mais cela devient un peu obscur. Pour trouver les fichiers cibles :
find a/ |
grep -i 'name'
Mais ils sont tous préfixés par "a/" - ce qui est logique, mais ce que nous voulons obtenir est une liste de modèles d'inclusion acceptables pour rsync, et comme le préfixe "a/" ne fonctionne pas pour rsync, je le supprimerai avec cut :
find . |
grep -i 'name' |
cut -d / -f 2-
Il y a toujours un problème - nous manquerons toujours des fichiers dans les sous-répertoires, parce que rsync ne recherche pas les répertoires dans la liste d'exclusion. Je vais utiliser awk pour ajouter les sous-répertoires de tous les fichiers correspondants à la liste des motifs d'inclusion :
find a/ |
grep -i 'name' |
cut -d / -f 2- |
awk -F/ '{print; while(/\//) {sub("/[^/]*$", ""); print}}'
Tout ce qui reste à faire est d'envoyer la liste à rsync - nous pouvons utiliser l'argument --include-from=- pour fournir une liste de motifs à rsync sur l'entrée standard. Donc, tout compte fait :
find a/ |
grep -i 'name' |
cut -d / -f 2- |
awk -F/ '{print; while(/\//) {sub("/[^/]*$", ""); print}}' |
rsync -avvz --include-from=- --exclude='*' ./a/ ./b/
Notez que le répertoire source 'a' est référencé par deux chemins différents - "a/" et "./a/". C'est subtil mais important. Pour rendre les choses plus cohérentes, je vais faire un dernier changement, et toujours faire référence au répertoire source comme "./a/". Cependant, cela signifie que la commande cut doit être modifiée car il y aura un "./" supplémentaire au début des résultats de find :
find ./a/ |
grep -i 'name' |
cut -d / -f 3- |
awk -F/ '{print; while(/\//) {sub("/[^/]*$", ""); print}}' |
rsync -avvz --include-from=- --exclude='*' ./a/ ./b/