我正在尝试在两台 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 选项。