Rsync “localiza” arquivos que estão implicitamente excluídos

1

Eu tenho um comando rsync semi-funcional que combinei com o comando find em uma caixa linux para fazer uma transferência de arquivo simples de um tipo e data específicos.

Aqui está o comando:

rsync -avx --timeout=30 --ignore-existing admin@host:''find /results/analysis/ -mtime -1 -type f -iname  "*.xq"'' /home/serverdir/

Aqui está o problema:

O comando acima funciona perfeitamente se algum arquivo for encontrado. Ele quebra quando nenhum arquivo é encontrado e, na verdade, envia um arquivo que está localizado no diretório inicial da máquina remota por algum motivo, que por sinal é muito mais antigo do que 1 dia, conforme indicado por -mtime.

A mensagem de erro:

receiving incremental file list
./
rsync: send_files failed to open "/home/admin/.viminfo": Permission denied (13)
file.txt

É como se quando o comando find não relatasse nada, o rsync simplesmente envia por padrão tudo no diretório inicial. Alguma idéia de como consertar isso?

    
por Sam 11.03.2015 / 22:55

2 respostas

1

Em vez de misturar find e rsync , já que tudo o que você parece querer copiar são os arquivos *.xq , você pode dizer a rsync para fazer isso diretamente. Eu incluí o sinalizador --dry-run para que você possa testá-lo com segurança sem que nenhuma alteração seja efetuada; quando estiver pronto, basta removê-lo da linha de comando.

rsync --dry-run -av --include '**/' --include '*.xq' --exclude '*' admin@host:/results/analysis/ /home/serverdir/

A mistura de --include e --exclude é explicada da seguinte forma, da esquerda para a direita:

  1. --include '**/' inclui todos os diretórios (mas não arquivos)
  2. --include '*.xq' inclui todos os arquivos (ou diretórios) que correspondem ao glob *.xq
  3. --exclude '*' exclui tudo que ainda não foi mencionado
por 12.03.2015 / 00:38
1

O que você observa é exatamente o que está acontecendo: apenas HOST: sem um caminho explícito pede para copiar o diretório padrão inteiro (geralmente o diretório inicial):

Note  also  that  host  and  module references don’t require a trailing
slash to copy the contents of the default directory.  For example, both
of these copy the remote directory’s contents into "/dest":

       rsync -av host: /dest
       rsync -av host::module /dest

Eu recomendaria evitar o uso de find inteiramente, se isso for possível (lembre-se de que o rsync usará largura de banda desprezível para arquivos já transferidos) ou executar a ação em duas etapas (primeiro find e rsync sobre sua saída).

Mais precisamente, algo como o seguinte deve funcionar (omiti algumas das suas opções de rsync por brevidade):

ssh user@host find source-dir -mtime -1 -type f -printf %p\\0 \
| rsync --from0 --files-from=- user@host:. dest-dir/

A principal alteração do que você mencionou como comentário: o comando find é executado no host remoto em vez de localmente.

    
por 11.03.2015 / 23:10

Tags