Reutilize a saída rsync --dry-run para acelerar a transferência real posteriormente

23

Eu costumo fazer rsync -nantes de fazer um real rsync. O problema é: como eu poderia automatizar a segunda execução para reutilizar exatamente a lista gerada --dry-run?

Quero dizer, se eu rodar, rsync -nentão eu faço uma simulação do que rsyncfaria, minha idéia seria pegar essa saída, processá-la e, de alguma forma, fazer rsyncapenas --include-fromessa saída, então a lista completa deve ser calculada apenas uma vez.

Se isso nem faz sentido, por favor, me avise.

A propósito, eu costumo usar rsync -hva --progress --stats --delete --exclude-from "$EXCLUDEFILE". Se você também tiver uma sugestão sobre quais opções você usaria, entre em contato. Estou tentando duplicar o conteúdo de um disco rígido externo (que contém apenas imagens, vídeos e documentos) para outro disco rígido externo.

Manuel
fonte
Você pode tentar redirecionar a saída do --dry-runcomando para um arquivo (por exemplo, rsync --dry-run -avz SOURCE DEST > include.txt), remover todas as linhas que não são arquivos / caminhos do include.txt e executar rsync --include-from include.txt.
precisa saber é o seguinte
Esse último comando deve ser rsync --include-from include.txt --exclude=* SOURCE DEST. Consulte stackoverflow.com/a/19296415/1765910 para obter detalhes.
precisa saber é o seguinte
Sim, essa é a ideia, mas não sei como fazer isso (além disso, gostaria da aprovação de alguém que realmente saiba o que está fazendo). Eu só uso rsync, mas não sei de nada a partir de scripts shell / bash ...
Manuel

Respostas:

18

Certamente é possível usar a lista de arquivos gerada durante uma execução a seco como um arquivo de inclusão. Idealmente, no entanto, as linhas extras na parte superior e inferior da saída a seco devem ser excluídas.

Exemplo de saída:

sending incremental file list
[LIST OF FILES]

sent 226 bytes  received 34 bytes  520.00 bytes/sec
total size is 648,373,274  speedup is 2,493,743.36 (DRY RUN)

Para remover essas linhas, canalize a rsyncsaída para headdentro tail. Em seguida, salve a saída processada em um arquivo de inclusão:

rsync --dry-run -avz source/ destination/ | head --lines=-3 | tail --lines=+3 > include.txt

Por fim, diga rsyncpara usar o arquivo de inclusão gerado (adicionando opções adicionais conforme desejado):

rsync --include-from=include.txt --exclude=* source/ dest/

Aquele cara
fonte
O problema é que ele não lida com arquivos que devem ser excluídos. E esse método de tail/ headrobusto é suficiente para garantir apenas a lista de arquivos?
Manuel
A adição --deletefaz com que os arquivos excluídos dos diretórios de origem sejam excluídos dos diretórios de destino, pelo menos no computador em que eu tentei. Você pode deixar de fora a parte tail/ head. rsyncinterpreta cada linha no arquivo de inclusão como um nome de arquivo e simplesmente ignora arquivos inexistentes; portanto, nada acontecerá se você mantiver as linhas extras (a menos que possua arquivos com o nome "enviando lista de arquivos incrementais" etc.). Nesse caso, esses arquivos também serão copiados).
ThatGuy