Como posso sincronizar novamente um conjunto de subdiretórios?

Como posso sincronizar novamente um conjunto de subdiretórios?

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

  • top_dir
    • projeto1
      • fonte/
      • caixa/
      • roteiros/
      • algum arquivo.txt
    • projeto2
      • fonte/
      • caixa/
      • alvo
        • caixa/
      • arquivo.xml

Eu gostaria de sincronizar novamente apenas os diretórios bin diretamente nos diretórios do projeto (ou seja, ignorar top_dir/proj2/target/bin/) e seu conteúdo no diretório de destino, para que fique assim:

  • top_dir
    • projeto1
      • caixa
    • projeto2
      • caixa

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

Responder1

Possibilidade 1

Usando a expansão do shell 1 em vez das rsyncregras de filtro de , você pode fazer o seguinte:

a. Para incluir todos binos diretórios na top_dirhierarquia:

rsync -av -R top_dir/**/bin/ destination_path

Aqui -Restá um parâmetro rsync 2 que significarelativo. man rsyncexplica isso como

Use caminhos relativos. Isso significa que os nomes completos dos caminhos especificados na linha de comando são enviados ao servidor, em vez de apenas as últimas partes dos nomes dos arquivos. Isto é particularmente útil quando você deseja enviar vários diretórios diferentes ao mesmo tempo.

mas, em essência, significa que a estrutura de diretórios é preservada.

**é um padrão global de shell e pesquisa recursivamente diretórios nomeados binem top_dir. Assim, com o exemplo acima, a linha de comando é expandida para:

rsync -av -R top_dir/proj1/bin/ top_dir/proj2/bin/ destination_path

b. Se você quiser incluir bindiretórios apenas um nível abaixo do diretório do projeto, basta usar um único *(que também funciona com shells "antigos"!):

rsync -av -R top_dir/*/bin/ destination_path

1 Você precisa de um recentefestaversão (>4) e ativar o globbing recursivo via shopts -s globstar. Comzshglobbing recursivo é o padrão.

2 protocolo rsync versão v3.2.3 versão 31 no Linux.

Possibilidade 2

Usando apenas as regras de filtro do rsync, você precisa:

a. Para incluir todos binos diretórios na top_dirhierarquia:

rsync -av -m --include='**/' --include='**/bin/**' --exclude='*' top_dir/ destination_path

A primeira includeregra pode não ser óbvia, 3 mas garante que todos os diretórios (observe o final /) sejam pesquisados, a segunda adiciona tudo nos bindiretórios e a excluderegra exclui todo o resto. -mgarante que diretórios vazios não sejam copiados.

b. Para incluir apenas um nível abaixo do diretório do projeto:

rsync -av -m  --include='/*/' --include='/*/bin/***' --exclude='*' top_dir/ destination_path

Usando ***a sintaxe de rsync >= 2.6.7. A liderança /nos padrões representa top_dir, caso contrário, os padrões serão comparados com ofimdo caminho do arquivo.


3 Procure /some/path/this-file-will-not-be-foundemman rsync

Responder2

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

informação relacionada