#!/bin/bash
URL="Your-URL"
content_length=$(curl -I $URL | grep -i 'Content-Length' | awk '{print $2}' | tr -d '\r')
# In Bytes
chunk_size=10000000
while true; do
offset=$(cat offset.txt | grep -Eo '[0-9]+')
next_chunk=$((offset + chunk_size - 1))
if [[ next_chunk -ge content_length ]]
then
curl -r $offset-$content_length --retry 10000 $URL > downloaded-chunk
# In here you can do your process with the last downloaded chunk
break
fi
curl -r $offset-$next_chunk $URL > downloaded-chunk
# In here you can do your process with a downloaded chunk
offset=$((next_chunk + 1))
echo "Offset of the last chunk downloaded: $offset bytes"
echo $offset > offset.txt
done
1条答案
按热度按时间n6lpvg4x1#
解决这个问题的主要思想是逐块下载文件,并将最后下载的块的偏移量写入某处。为此,首先,我们指定块大小。
块大小接近下载文件的大小,性能更好,但在连接损坏中丢失更多数据的风险增加。我的建议是下载文件大小的10%左右。根据我的经验,使用这种方法,下载速度下降了大约
25
%。整个文件的大小需要知道我们应该在哪里使用
curl
和范围选项-r
。最后一个数据块通常不适合块大小,这由while中的if
条件处理。