O rsync não fala regex. Você pode recrutar find e grep, apesar de ficar um pouco misterioso. Para encontrar os arquivos de destino:
find a/ |
grep -i 'name'
Mas todos são prefixados com "a /" - o que faz sentido, mas o que queremos terminar é uma lista de padrões de inclusão aceitáveis para rsync e como o prefixo "a /" não funciona para rsync I ' vou removê-lo com corte:
find . |
grep -i 'name' |
cut -d / -f 2-
Ainda existe um problema - ainda vamos perder os arquivos nos subdiretórios, porque o rsync não pesquisa diretórios na lista de exclusões. Vou usar o awk para adicionar os subdiretórios de qualquer arquivo correspondente à lista de padrões de inclusão:
find a/ |
grep -i 'name' |
cut -d / -f 2- |
awk -F/ '{print; while(/\//) {sub("/[^/]*$", ""); print}}'
Tudo o que resta é enviar a lista para o rsync - podemos usar o argumento --include-from = - para fornecer uma lista de padrões para o rsync na entrada padrão. Então, no total:
find a/ |
grep -i 'name' |
cut -d / -f 2- |
awk -F/ '{print; while(/\//) {sub("/[^/]*$", ""); print}}' |
rsync -avvz --include-from=- --exclude='*' ./a/ ./b/
Observe que o diretório de origem 'a' é referido por dois caminhos diferentes - "a /" e "./a/". Isso é sutil, mas importante. Para tornar as coisas mais consistentes, farei uma alteração final e sempre me refiro ao diretório de origem como "./a/". No entanto, isso significa que o comando de corte precisa ser alterado, pois haverá um "./" extra na frente dos resultados 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='*'
?