inconsistência entre as máquinas Rsync

1

Eu apenas comecei a tentar usar o rsync para fazer alguns backups de algumas máquinas Linux em um servidor Windows, que executa o restante do sistema de backup. Depois de muita leitura e experimentação, finalmente consegui que tudo funcionasse em uma das máquinas Linux (Centos), então copiei o script para a outra máquina (Debian), editei alguns caminhos e tentei executá-lo. Em vez de correr como na primeira máquina, recebo o seguinte resultado:

building file list ...
1 file to consider

sent 36 bytes  received 16 bytes  11.56 bytes/sec
total size is 0  speedup is 0.00

O script em questão é:

#! /bin/sh
/usr/bin/rsync \
--progress \
--recursive \
-t \
--delete-excluded \
--filter="- .cpan/***" \
--filter="- include/***" \
--filter="- cache/***" \
--filter="- lib/***" \
--filter="- cvs/***" \
--filter="+ /BayesTraining/***" \
--filter="+ /BogoTraining/***" \
--filter="+ /etc/***" \
--filter="+ /var/***" \
--filter="+ /root/***" \
--filter="+ /boot/***" \
--filter="+ /usr/local/***" \
--filter="+ /home/***" \
--filter="- *" \
/ \
rsync://myserver/targetfolder

Ele só começará a enviar arquivos se eu remover esse último parâmetro de filtro, mas ele envia um monte mais do que eu quero.

Onde eu enfiei e o que preciso mudar? (Antes que alguém pergunte, eu não estou usando o rsync via SSH porque o servidor Windows ainda não tem um serviço SSH ainda. Pequenos passos ...)

Editar: rsync --version revela

Centos: rsync  version 2.6.8  protocol version 29
Debian: rsync  version 2.6.4  protocol version 29

Solução: Graças ao pavium por apontar que negligenciei uma parte crucial na página man (reformatada para legibilidade):

a trailing "dir_name/***" will match both the directory (as  if "dir_name/"
had been specified) and everything in the directory (as if "dir_name/**"
had been  specified). This  behavior  was added in version 2.6.7.

A solução é criar as seguintes regras para cada diretório que eu quero incluir:

--filter="+ /dirname/"
--filter="+ /direname/**"
    
por John Gardeniers 05.01.2010 / 23:36

3 respostas

3

O último item de filtro pode ser o seu problema (bem, eu acho que você sabe isso). Eu encontrei o seguinte na página de manual rsync 2.6.9:

Note that, when using the --recursive (-r) option (which is implied by -a), every subcomponent of every path is visited from the top down, so include/exclude patterns get applied recursively to each subcomponent’s full name (e.g. to include “/foo/bar/baz” the subcomponents “/foo” and “/foo/bar” must not be excluded). The exclude patterns actually short-circuit the directory traversal stage when rsync finds the files to send. If a pattern excludes a particular parent directory, it can render a deeper include pattern ineffectual because rsync did not descend through that excluded section of the hierarchy. This is particularly important when using a trailing ’*’ rule. For instance, this won’t work:

+ /some/path/this-file-will-not-be-found
+ /file-is-included
- *

This fails because the parent directory “some” is excluded by the ’*’ rule, so rsync never visits any of the files in the “some” or “some/path” directories. One solution is to ask for all directories in the hierarchy to be included by using a single rule: “+ */” (put it somewhere before the “- *” rule), and perhaps use the --prune-empty-dirs option. Another solution is to add specific include rules for all the parent dirs that need to be visited. For instance, this set of rules works fine:

+ /some/
+ /some/path/
+ /some/path/this-file-is-found
+ /file-also-included
- *

Portanto, o - * está excluindo os caminhos não explicitamente incluídos anteriormente nas regras de filtragem. A página man também me diz que o comportamento "dir_name / ***" à direita (que teria habilitado esses caminhos) foi adicionado na versão 2.6.7 (seu Debian é anterior)

    
por 06.01.2010 / 01:20
2

Modo de depuração psíquica ativado:

O Bash provavelmente está expandindo o * para uma lista de todos os arquivos no diretório atual, portanto o rsync não vê um * , ele vê file1 file2 file3 .

Tente escapar do * - --filter="- \*" \ , ou --filter='- *' \ deve fazer o truque.

    
por 06.01.2010 / 00:37
0

Execute 'rsync --version' nas caixas CentOS e Debian e compare os resultados. O Debian é um talvez mais antigo? É possível que seja uma falha dessa versão específica ou da maneira como foi compilada nessa caixa.

    
por 06.01.2010 / 00:13