单个 unix 命令可以正确传输大文件吗?

单个 unix 命令可以正确传输大文件吗?

我正在尝试在两台 Unix 机器之间传输一个大文件(~3GB)。

我可以使用 scp 或 rsync,但有时传输会损坏。(我必须手动检查。)我可以将文件拆分成几部分,然后传输它们,然后进行校验和,然后重新组合,但这很繁琐。

是否有一个命令可以在两台 Unix 机器之间正确传输大型文件?我希望它自动对两个副本进行校验和,并不断重做传输(或传输的部分),直到所有字节都正确传输。

答案1

Rsync 的工作原理是将文件分成多个块,并且只传输不同的块。就其本质而言,它应该能够检测和修复损坏。您是否尝试过使用 --partial 选项,如果中断,该选项将使其继续,并反复重新运行该命令,直到不再传输任何数据?

您是否在连接的远程端使用 rsync 服务器?如果没有,那么您实际上并没有使用 rsync 来传输文件,它只是使用您正在使用的任何底层传输方法,因此您不会检测到错误。

答案2

在 rsync 中使用 -c 选项(校验和)。

rsync -azcvPh file1 user@remotehost:/tmp/

-P 选项显示进度统计信息,并帮助您了解文件传输中断的位置/时间。-h 使其“人性化”,-z 使其压缩。

答案3

您正在使用最好的命令,但您的计算机坏了。我强烈建议运行 memtest86+在两台机器上过夜检查您的 RAM。

答案4

您始终可以在主机之间通过 BitTorrent 进行下载,但我不确定如何自动化执行该操作。

我不经常做这种事,所以我不会编写脚本。相反,我会建立一个大的单行代码来完成这项工作。所以从技术上讲,这不是一个命令,而是都在一行上。如果你经常这样做,编写脚本并不难。

$ 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

这分为:

$ 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

您必须设置 SSH 才能使用密钥授权登录到您的主机,以便在无需交互的情况下运行它。如果您这样做了,请在其中放置一个 echo 语句来告诉您它在哪里。

已测试,但我希望可以调整 rsync 选项。

相关内容