Único comando unix para transferir corretamente um arquivo grande?

3

Estou tentando transferir um arquivo grande (~ 3GB) entre duas máquinas unix.

Eu posso usar scp ou rsync, mas às vezes a transferência está corrompida. (Eu tenho que verificar manualmente.) Eu posso dividir o arquivo em pedaços e transferi-los e, em seguida, soma de verificação e, em seguida, recombinar, mas isso é tedioso.

Existe um único comando para transferir corretamente um arquivo grande entre duas máquinas Unix? Eu quero que ele verifique automaticamente ambas as cópias, e continue refazendo a transferência (ou partes dela) até obter todos os bytes através do fio corretamente.

    
por user13798 10.10.2009 / 11:46

4 respostas

7

O Rsync funciona dividindo um arquivo em partes e transferindo apenas as partes se elas forem diferentes. Por sua própria natureza, deve ser capaz de detectar e corrigir a corrupção. Você já tentou usar a opção --partial, que permite continuar se for interrompida e reexecutar o comando repetidamente até que ele não transfira mais nenhum dado?

Você está usando um servidor rsync na extremidade remota da conexão? Se não, você não está realmente usando o rsync para transferir o arquivo, ele está usando apenas o método de transporte subjacente que você está usando, então você não terá a detecção de erros.

    
por 10.10.2009 / 11:55
6

Use a opção -c (soma de verificação) no rsync.

rsync -azcvPh file1 user@remotehost:/tmp/

A opção -P exibe as estatísticas de progresso e ajudará você a entender onde / quando a transferência de arquivos é interrompida. O -h torna "legível para humanos" e o -z comprime.

    
por 10.10.2009 / 16:01
3

Você está usando os melhores comandos, mas seu computador está quebrado. Eu recomendo executar o memtest86 + em ambas as máquinas durante a noite para verificar sua memória RAM.

    
por 10.10.2009 / 13:51
1

Você pode sempre bittorrent entre os hosts, mas não tenho certeza de como automatizá-lo de improviso.

Eu não faço esse tipo de coisa com frequência, então não faço scripts. Em vez disso, eu criaria um grande one-liner para fazer o trabalho. Então, tecnicamente, isso não é um comando, mas é tudo em uma linha. Não é difícil roteirizar se você faz isso com frequência.

$ md5sum bigfile > bigfile.md5 ; export BIGFILE="notdone" ; while [ "$BIGFILE" eq "notdone" ] ; do rsync --checksum --partial bigfile* user@remotehost:path/to/put/it/in/ ; ssh user@remotehost "cd path/to/put/it/in/; md5sum -c < bigfile.md5" | grep -Ev 'OK$' | [ 'wc -l' == "0" ] && BIGFILE="done" ; done

Isso se divide em:

$ md5sum bigfile > bigfile.md5 ;         \  # create our own checksum
  export BIGFILE="notdone" ;             \  # set our check variable
  while [ "$BIGFILE" == "notdone" ]; do  \  # recheck variable state after each pass
     rsync --checksum --partial bigfile* \  # call rsync to copy
          user@remotehost:path/to/put/it/in/ ; \  # and call ssh to check
     ssh user@remotehost                 \  # connect with ssh
       "cd path/to/put/it/in/; md5sum -c < bigfile.md5" \ # and run the check
          | grep -Ev 'OK$'               \  # ignore good output
          | [ 'wc -l' == "0" ]           \  # if we didn't find one
            && BIGFILE="done" ;          \  # set our get-out-of-jail card
  done                                   \  # and we're done

Você precisa configurar o SSH para fazer login no seu host com autorização de chave para executá-lo sem interação. Se você fizer isso, coloque uma instrução echo para informar onde está.

Testado, mas espero que as opções de rsync possam ser ajustadas.

    
por 10.10.2009 / 14:37

Tags