rsync apenas um subconjunto específico de diretórios

4

Eu preciso usar o rsync para sincronizar vários diretórios de um servidor rsync. Todo o módulo rsync é bastante grande e eu gosto de evitar lidar com as outras partes, não requeridas também.

Eu tenho os diretórios desejados como arquivo de texto, mas tenho problemas para criar um arquivo de regras de filtro adequado. Meus requisitos são os seguintes:

  • Inclua somente diretórios na minha lista com todos os arquivos e subdiretórios neles.
  • Os arquivos nos diretórios incluídos devem ser excluídos se forem excluídos no servidor.
  • No entanto, todos os diretórios .hg (repositório Mercurial) localizados em meu site, mas não no servidor, e todos os arquivos e subdiretórios neles, não devem ser excluídos.
  • Os diretórios excluídos não devem ser excluídos.

Até agora eu criei um arquivo de filtro que se parece com isso

include sub/dir/I/want/***
include other/sub/dir/I/want/***
...
protect .hg/***
exclude **

Mas isso exclui tudo aparentemente. Sem a linha exclude , todos os outros arquivos também estão incluídos.

    
por Martin Scharrer 24.09.2011 / 15:14

2 respostas

2

Eu encontrei o problema. Meus problemas foram causados pela maneira como rsync está processando os nomes dos arquivos. O caminho include absoluto (ou seja, relativo à raiz de transferência) não funciona diretamente porque os diretórios pai também devem ser incluídos. Caso contrário, toda a estrutura de diretório já estará excluída e o arquivo ou subdiretório desejado nunca será processado. O manual real diz isso (em algum lugar), mas é altamente contra-intuitivo.

Para incluir apenas determinadas sub-pastas, todos os diretórios pai devem ser incluídos e todas as outras sub-dirs deles devem ser excluídas novamente:

include sub/
include sub/dir/
include sub/dir/I/
include sub/dir/I/want/***
exclude sub/*
exclude sub/dir/*
exclude sub/dir/I/*

include other/
include other/sub/
include other/sub/dir/
include other/sub/dir/I/
include other/sub/dir/I/want/***
exclude other/*
exclude other/sub/*
exclude other/sub/dir/*
exclude other/sub/dir/I/*

...

protect .hg*
exclude /*

A segunda e última linha protege todos os diretórios e arquivos .hg* , como .hg/ e .hgtags . A linha exclui todos os outros dirs na raiz de transferência.

Eu escrevi um script Perl para produzir o arquivo de filtro acima da lista de subdiretórios desejados. Está acessível no link .

    
por 27.09.2011 / 11:27
0

Execute o rsync duas vezes.

rsync hostname::sub/dir/I/want/        ./sub/dir/I/want/
rsync hostname::other/sub/dir/I/want/  ./other/sub/dir/I/want/
    
por 24.09.2011 / 15:44