Como posso rsync um conjunto de subdiretórios?

6

Eu tenho um diretório de origem que se parece com o seguinte (com vários subdiretórios dentro dos diretórios src e bin):

  • top_dir
    • proj1
      • src /
      • bin /
      • scripts /
      • somefile.txt
    • proj2
      • src /
      • bin /
      • alvo
        • bin /
      • file.xml

Gostaria de rsync apenas as diretas bin diretamente sob os diretórios do projeto (ou seja, ignorar top_dir / proj2 / target / bin /) e seu conteúdo para o diretório de destino, para que fique assim:

  • top_dir
    • proj1
      • bin
    • proj2
      • bin

Eu provavelmente poderia fazê-lo funcionar listando explicitamente cada diretório bin (existem cerca de 15 no meu cenário real) em um arquivo include-from, mas eu estava pensando que deve haver uma maneira de dizer que quero sincronizar todos os diretórios top_dir / * / bin.

    
por Matt Passell 30.06.2014 / 17:03

2 respostas

9

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

    
por 30.06.2014 / 19:36
0

Você pode excluir todos os diretórios src usando --exclude src/

    
por 30.06.2014 / 17:15

Tags