我通过wget ,1.2TB通过http下载一个大文件。 下载大概需要一个星期,现在已经包含两次腐败(失败的MD5检查,这需要几天时间才能运行)。
是否有一种很好的方法来validation文件零碎的HTTP使用curl ? 或者把它分成不同的块,这样我可以识别一个特定的坏块,重新下载这个块?
该文件是一个tar档案,所以我认为每个块的损坏可以在解包过程中顺序识别。
在服务器端,可以使用dd和md5sum来校验文件的每个块:
#!/bin/bash FILENAME="$1" FILESIZE=`stat --printf="%s" $FILENAME` CHUNKSIZE=536870912 # 512MB CHUNKNUM=0 while ! grep -q 'cannot skip' hash.log 2> /dev/null ; do dd if=$FILENAME bs=$CHUNKSIZE skip=$CHUNKNUM count=1 2> hash.log | md5sum >> $FILENAME.md5 CHUNKNUM=$(( CHUNKNUM + 1 )) done rm hash.log
您将剩下一个$FILENAME.md5文件与所有块散列。
您现在可以下载该大文件和校验和,在该文件上运行此脚本并比较哈希值。 如果有任何部分得到不匹配的散列,则可以使用curl下载部分文件(如果服务器支持RANGE),并使用dd打补丁。
例如,如果块2得到散列不匹配:
curl -s -r 536870912-1073741824 | dd of=somelargetarfile.tar seek=536870912 conv=notrunc
这将下载块2,并用它来修补大的tar文件。
ThoriumBR的答案很好,但我想添加一些额外的build议,以防您无法访问远程服务器。
本地已经有一个(或更多)不好的下载。
使用ThoriumBR给出的分割技巧,你可以在本地分割这些文件,并利用好的部分。
将每个块与使用curl下载的相同块进行比较(按照ThoriumBR的最后一条指令)。 如果你有两个相同的块(二进制差异,不需要慢速MD5),你可以相对肯定,这是一个很好的块。 所以保存在别的地方,并重复下一个块。
所以:对于每个块:比较你的本地副本(如果你有多个),并添加新鲜下载的副本,并比较,直到你find2个相同的块:这是一个要保持的。
这是一个相当的体力劳动,但可行。 你甚至可以编写整个过程的脚本,但是这样做(和debugging脚本)可能不值得。
在源服务器上,创build一个BitTorrent .torrent并将现有位置添加为Web种子URL。 BitTorrent将validation块。 如果需要,任何pipe理下载副本的客户端都可以播种。
这确实需要一个好的文件副本来创build.torrent。 与ThoriumBR的解决scheme非常相似,使用不同的工具。
如果你仍然有失败的文件和/或校验和,比较每个和校验和。 每次同样的结果可能表明您的传输是正确的,但是远程文件与其已知的校验和不一致。