rsync ne parle pas regex. Vous pouvez enrôler find et grep, bien que cela devienne un peu mystérieux. Pour rechercher 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 nous retrouver c'est une liste de modèles d'inclusion acceptables pour rsync, et comme le préfixe "a /" ne fonctionne pas pour rsync I ' ll le retirer avec coupe:
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, car 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 modèles d'inclusion:
find a/ |
grep -i 'name' |
cut -d / -f 2- |
awk -F/ '{print; while(/\//) {sub("/[^/]*$", ""); print}}'
Il ne reste plus qu'à envoyer la liste à rsync - nous pouvons utiliser l'argument --include-from = - pour fournir une liste de modèles à rsync sur une entrée standard. Donc, tout à 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é via 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 changer car il y aura un "./" supplémentaire sur le devant 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/
--exclude='*'
?