Como eu especifico uma regra por diretório no rsync?

0

Na seção INCLUDE/EXCLUDE PATTERN RULES da página man, ele diz o seguinte:

if the pattern starts with a / then it is anchored to a particular spot in the hierarchy of files, otherwise it is matched against the end of the pathname. This is simi‐ lar to a leading ^ in regular expressions. Thus "/foo" would match a name of "foo" at either the "root of the transfer" (for a global rule) or in the merge-file’s direc‐ tory (for a per-directory rule). An unqualified "foo" would match a name of "foo" anywhere in the tree because the algorithm is applied recursively from the top down; it behaves as if each path component gets a turn at being the end of the filename. Even the unanchored "sub/foo" would match at any point in the hierarchy where a "foo" was found within a directory named "sub". See the section on ANCHORING INCLUDE/EXCLUDE PATTERNS for a full discussion of how to specify a pattern that matches at the root of the transfer.

Como alguém poderia especificar uma regra por diretório? e quais são os efeitos que isso teria?

    
por daka 22.09.2018 / 16:44

1 resposta

2

Sem uma opção de exclusão, as "regras por diretório" são relevantes apenas no lado do envio, portanto, você pode se sentir à vontade para excluir os arquivos de mesclagem sem afetar a transferência. Por exemplo:

rsync -av --filter='dir-merge /.rsync-filter' --exclude=.excl host:src/dir /dest 
rsync -av --filter='dir-merge /.rsync-filter' host:src/dir /dest 


--filter='dir-merge /.rsync-filter' This tells rsync to look for per-directory .rsync-filter files that have
been sprinkled through the hierarchy and use their rules to filter the files in the transfer. If -F is repeated, it is a shorthand for this rule:

No entanto, se você quiser fazer uma exclusão no lado do recebimento E quiser que alguns arquivos sejam excluídos, você precisa ter certeza de que o lado de recebimento sabe quais arquivos excluir. A maneira mais fácil é incluir os "arquivos de mesclagem por diretório" na transferência e usar --delete-after, porque isso garante que o lado de recebimento receba as mesmas regras de exclusão do lado de envio antes de tentar excluir qualquer coisa:

rsync -avF --delete-after host:src/dir /dest 

No entanto, se os arquivos não fizerem parte da transferência, você precisará especificar algumas regras de exclusão globais (ou seja, especificadas na linha de comando) ou precisará manter seus próprios arquivos por diretório no lado do recebimento. Um exemplo do primeiro é este (suponha que os arquivos .rules remotos se excluam):

rsync -av --filter='remote .rules' --filter='remote /my/extra.rules'
   --delete host:src/dir /dest

No exemplo acima, o arquivo extra.rules pode afetar ambos os lados da transferência, mas (no lado de envio) as regras são subservientes às regras mescladas dos arquivos .rules porque foram especificadas após a mesclagem por diretório regra.

Em um exemplo final, o lado remoto está excluindo os arquivos .rsync-filter da transferência, mas queremos usar nossos próprios arquivos .rsync-filter para controlar o que é excluído no lado do recebimento. Para fazer isso, devemos excluir especificamente os arquivos de mesclagem por diretório (para que eles don (cqt sejam excluídos) e, em seguida, colocar regras nos arquivos locais para controlar o que mais não deve ser excluído. Como um desses comandos:

   rsync -av --filter=':e /.rsync-filter' --delete \
        host:src/dir /dest
    rsync -avFF --delete host:src/dir /dest
    
por 22.09.2018 / 18:35

Tags