rsync: copia a árvore incluindo apenas um arquivo em cada nível

0

Eu quero copiar todos os arquivos "pom.xml" de uma grande árvore para uma nova árvore: Em cada nível da árvore src eu tenho este arquivo. Eu quero obter a mesma estrutura de árvore, mas ignorar diretórios vazios.

soa como um one-liner de rsync mas eu não entendo ...: - /

obrigado antecipadamente ...

    
por Bastl 24.04.2012 / 15:10

2 respostas

2

Você pode fazer isso, por exemplo,

rsync -rvm --include='*/' --filter='-! pom.xml' SOURCE DEST
  • -r recurses,
  • -v imprime com detalhes o que acontece,
  • -m remove diretórios vazios (diretórios que não contêm nada após a transferência),
  • --include='*/' informa rsync para incluir explicitamente os próprios diretórios que são excluídos do próximo filtro (esta é uma ressalva que eu estive preso por quantidade vergonhosa de vezes: que os diretórios explicitamente precisa ser permitido em casos como este),
  • --filter='-! pom.xml' exclui arquivos que não não (é o que " ! " faz) correspondem ao padrão (isso incluiria todos os diretórios, sem o padrão --include acima).

Como eu disse, eu tenho coçado minha cabeça várias vezes sobre o comportamento dos diretórios em regras complexas de filtragem para o rsync, e talvez esteja claro no manual, mas nesse caso eu tenho sido capaz de perder isso por um longo tempo. tempo, então um esclarecimento seria apreciado.

    
por 24.04.2012 / 15:57
0

Da pasta raiz da árvore:

find . -name pom.xml | rsync -ax --files-from=- . /destination/tree/

O rsync não pode fazer um "excluir tudo exceto", então nós encontramos os arquivos primeiro, então os alimentamos na lista files-from via entrada padrão (o - ). O -a significa arquivamento, assim como a recursão e retenção de permissões. O -x significa "não percorre os sistemas de arquivos", o que costumo incluir fora do hábito e removê-lo quando tiver certeza de que quero percorrer os sistemas de arquivos.

    
por 24.04.2012 / 16:03