Possibilidade 1
Não usando as regras de filtragem do rsync, mas a expansão do shell * que você pode fazer:
a. Para incluir todos os bin dirs na hierarquia top_dir :
rsync -av -R top_dir/**/bin/ destination_path
Aqui -R é um parâmetro rsync que representa relativo e significa que a estrutura de diretórios é preservada.
** é um padrão de globalização de shell e procura recursivamente por diretórios denominados bin em top_dir . Então, com você acima do exemplo, a linha de comando é expandida para:
rsync -av -R top_dir/proj1/bin/ top_dir/proj2/bin/ destination_path
b. Se você quiser incluir apenas bin dirs um nível abaixo do diretório do projeto, use apenas um único * (que também funciona com shells "antigos"):
rsync -av -R top_dir/*/bin/ destination_path
* Você precisa de uma versão recente do bash (> 4) e ativar a globalização recursiva via shopts -s globstar . Com zsh a globalização recursiva é o padrão.
Possibilidade 2
Apenas usando as regras de filtragem do rsync, você precisa:
a. Para incluir todos os bin dirs na hierarquia top_dir :
rsync -av -m --include='**/' --include='**/bin/**' --exclude='*' top_dir/ destination_path
A primeira regra de inclusão pode não ser óbvia + , mas garante que todos os diretórios (observe o / à direita) são pesquisados, o segundo finalmente inclui tudo em bin diretórios e a regra de exclusão exclui tudo mais. -m garante que os diretórios vazios não sejam copiados.
b. Apenas um nível abaixo do diretório do projeto:
rsync -av -m --include='/*/' --include='/*/bin/***' --exclude='*' top_dir/ destination_path
Usando a sintaxe *** do rsync > = 2.6.7. O / inicial nos padrões representa top_dir , caso contrário, os padrões são comparados com o fim do caminho do arquivo.
+ Pesquise /some/path/this-file-will-not-be-found em man rsync