rsync --remove-source-files, mas apenas aqueles que correspondem a um padrão

4

Isso é possível com o rsync?

Transfira tudo de src:path/to/dir para dest:/path/to/other/dir e exclua alguns dos arquivos de origem em src:path/to/dir que correspondam a um padrão (ou limite de tamanho), mas mantenha todos os outros arquivos. Não consegui encontrar uma maneira de limitar --remove-source-files com um limite de tamanho normal ou de expressão regular.

Update1 (esclarecimento): Gostaria que todos os arquivos em src:path/to/dir fossem copiados para dest:/path/to/other/dir . Uma vez feito isso, eu gostaria de ter alguns arquivos (aqueles que correspondem a um limite de tamanho ou expressão regular) em src:path/to/dir excluídos, mas não quero ter nada excluído em dest:/path/to/other/dir .

Update2 (mais esclarecimentos): Infelizmente, não posso simplesmente rsync tudo e, em seguida, excluir manualmente os arquivos correspondentes a minha regexp de src :. Os arquivos a serem excluídos são criados continuamente.

Então, vamos dizer que existem N arquivos do tipo que eu gostaria de deletar após a transferência em src: quando o rsync é iniciado. Quando o rsync terminar, haverá N + M tais arquivos lá. Se eu agora os excluir manualmente, perderei os arquivos M que foram criados enquanto o rsync estava em execução.

Portanto, gostaria de ter uma solução que garanta que os únicos arquivos excluídos de src: sejam aqueles conhecidos para serem copiados com sucesso para dest :. Eu poderia buscar uma lista de arquivos do dest: após a conclusão do rsync, e comparar essa lista de arquivos com o que eu tenho em src:, e depois fazer a remoção manualmente. Mas eu queria saber se o rsync pode fazer isso sozinho.

    
por quack quixote 13.02.2010 / 16:23

2 respostas

0

Você deseja excluir antes da transferência ou depois? Isto é, deve dest: ter os arquivos apagados?

Eu suspeito que a maneira mais fácil é fazer isso como comandos separados. Use find | xargs rm para excluir os arquivos desejados (talvez adicionando um egrep ao pipe se o regex for complexo) e rsync para fazer a cópia. A ordem de execução será determinada pela resposta à minha pergunta no primeiro parágrafo.

    
por 13.02.2010 / 16:58
0

O mais provável é que a maneira "correta" de fazer o que você quer é através de encontrar com uma função - isso permite que você faça isso de uma maneira "quase atômica".

Eu também recomendo usar o mtime - isso impede que ele faça arquivos que ainda estão sendo gravados -, embora provavelmente haja outras maneiras melhores de evitar isso também.

Veja também link para os relacionados maneiras de exportar funções. O exemplo abaixo é específico do bash:

pattern='^match\.this\.pattern.*only$'

rsync_rm() {
 rsync path/to/dir/$1 dest:/path/to/other/dir/.
 echo $1 | egrep $pattern > /dev/null && rm $1
}

export -f rsync_rm

find path/to/dir -mtime +1 -exec bash -c 'rsync_rm "$@"' bash {} +
    
por 29.08.2014 / 15:43