
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
- projeto1
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
- projeto1
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 rsync
regras de filtro de , você pode fazer o seguinte:
a. Para incluir todos bin
os diretórios na top_dir
hierarquia:
rsync -av -R top_dir/**/bin/ destination_path
Aqui -R
está um parâmetro rsync 2 que significarelativo. man rsync
explica 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 bin
em 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 bin
diretó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 bin
os diretórios na top_dir
hierarquia:
rsync -av -m --include='**/' --include='**/bin/**' --exclude='*' top_dir/ destination_path
A primeira include
regra pode não ser óbvia, 3 mas garante que todos os diretórios (observe o final /
) sejam pesquisados, a segunda adiciona tudo nos bin
diretórios e a exclude
regra exclui todo o resto. -m
garante 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-found
emman rsync
Responder2
Você pode excluir todos src
os diretórios usando--exclude src/