rsync ignora o padrão de exclusão ancorado

0

Eu faço o seguinte:

rsync --recursive --delete --delete-excluded --exclude-from=$HOME/etc/rsync_exclude.txt --relative --safe-links --executability . /path/to/savedir

Observe que o diretório de origem é o diretório de trabalho (especificado como . )

Dentro do diretório de trabalho, eu tenho um diretório ./repository e um arquivo ./Vagrantfile .

O arquivo rsync_exclude.txt contém, entre outras, as linhas

/repository/
/Vagrantfile

Eu esperava que essas entradas excedessem meus repository e Vagrantfile , porque

  • a barra inicial expressa que os nomes devem ser ancorados no diretório raiz para salvar, que é o diretório de trabalho e
  • a barra no repositório declara explicitamente que este é um diretório, não um arquivo

No entanto, ambas as entradas são copiadas.

O que eu fiz de errado?

(Este é o rsync 2.6.9 em execução no MacOS Sierra (mas acho que isso não importa neste caso)).

ATUALIZAÇÃO:

Ao depurar o rsync (usando -vv e --dry-run) posso ver claramente que todas as regras não ancoradas são aceitas (por exemplo, o rsync me diz esconder o diretório vp5 / .git por causa do padrão. git / ), mas nenhuma das regras ancoradas funciona. Eu também tentei substituir o diretório de origem (.) Por ./ ou $ PWD, mas isso também não teve nenhum efeito.

Além disso, quando eu removo o início / (por exemplo, transformando / repositório / em repositório /), o diretório é excluído. É claro que este diretório agora seria excluído em qualquer lugar na árvore, o que não prejudica neste caso em particular, mas não é o que eu quero em geral).

    
por user1934428 02.05.2017 / 15:23

1 resposta

0

O seguinte funciona para mim com rsync versão 3.1.2:

$ ls -F
archive/  backup/  mk-archive.sh*  mk-backup.sh*  mk-cloud.sh*  mk-source.sh*  source/

$ cat /tmp/excludes
/archive/
/backup/
/mk-archive.sh
/mk-backup.sh

$ mkdir -p /tmp/target
$ rsync --relative --recursive --delete --delete-excluded --exclude-from=/tmp/excludes . /tmp/target/

$ ls -F /tmp/target
mk-cloud.sh*  mk-source.sh*  source/

O que está acontecendo aqui é conforme descrito na man page de rsync , portanto, seus padrões devem ser ancorados em / imediatamente no início da cópia (ou seja, em . ).

ANCHORING INCLUDE/EXCLUDE PATTERNS
As mentioned earlier, global include/exclude patterns are anchored at the "root of the transfer" [...].

Because the matching is relative to the transfer-root, changing the trailing slash on a source path or changing your use of the --relative option affects the path you need to use in your matching (in addition to changing how much of the file tree is duplicated on the destination host). [...]

Example:

cd /home; rsync -a --relative me/foo you/ /dest

+/- pattern: /me/foo/bar (starts at specified path)
+/- pattern: /you/bar/baz (ditto)

Target file: /dest/me/foo/bar
Target file: /dest/you/bar/baz

Você pode ver as exclusões sendo processadas adicionando -vv (ou --verbose --verbose ) ao comando rsync .

    
por 03.05.2017 / 19:27

Tags