本文目录导读:

在脚本中使用 Curl 下载大文件并实现断点续传,关键参数是 -C(或 --continue-at),以下是一些最佳实践和方法:
基础续传命令
# -C - 表示自动检测断点并续传 curl -C - -O https://example.com/largefile.zip
-C -:自动从上次下载的位置继续-O:保存为原始文件名
完整的脚本示例
#!/bin/bash
URL="https://example.com/largefile.iso"
FILENAME="largefile.iso"
# 检查文件是否存在并获取已下载大小
if [ -f "$FILENAME" ]; then
LOCAL_SIZE=$(stat -c%s "$FILENAME" 2>/dev/null || echo 0)
echo "已下载: $LOCAL_SIZE 字节"
else
LOCAL_SIZE=0
fi
# 使用 -C - 参数进行续传
echo "开始下载 (支持断点续传)..."
curl -C - -o "$FILENAME" "$URL"
# 检查下载是否成功
if [ $? -eq 0 ]; then
echo "下载完成: $FILENAME"
else
echo "下载中断,可重新运行脚本续传"
fi
带重试机制的脚本
#!/bin/bash
URL="https://example.com/largefile.zip"
FILENAME="largefile.zip"
MAX_RETRIES=5
RETRY_DELAY=5
download_with_resume() {
for ((i=1; i<=$MAX_RETRIES; i++)); do
echo "尝试 $i: 开始下载..."
# 使用 -C - 自动续传
curl -C - -o "$FILENAME" "$URL"
# 检查返回码
status_code=$?
if [ $status_code -eq 0 ]; then
echo "下载成功完成!"
return 0
elif [ $status_code -eq 18 ]; then
# 18 表示部分传输,适合重试
echo "部分下载完成,等待 $RETRY_DELAY 秒后重试..."
sleep $RETRY_DELAY
else
echo "错误 $status_code: 下载失败"
if [ $i -lt $MAX_RETRIES ]; then
echo "$RETRY_DELAY 秒后重试..."
sleep $RETRY_DELAY
fi
fi
done
echo "重试次数已达上限,下载失败"
return 1
}
# 执行下载
download_with_resume
带进度显示的版本
#!/bin/bash
URL="https://example.com/largefile.iso"
FILENAME="largefile.iso"
RETRY_COUNT=0
MAX_RETRIES=10
while [ $RETRY_COUNT -lt $MAX_RETRIES ]; do
echo "下载尝试 $((RETRY_COUNT + 1))/$MAX_RETRIES"
# -L 跟随重定向 | -# 显示进度条 | -C - 续传
curl -L -# -C - -o "$FILENAME" "$URL"
if [ $? -eq 0 ]; then
echo "下载完成!"
break
fi
echo "下载中断,5秒后重试..."
sleep 5
RETRY_COUNT=$((RETRY_COUNT + 1))
done
if [ $RETRY_COUNT -eq $MAX_RETRIES ]; then
echo "下载最终失败"
exit 1
fi
验证下载完整性
#!/bin/bash
URL="https://example.com/file.iso"
FILENAME="file.iso"
EXPECTED_HASH="abc123..." # 已知的 SHA256 哈希值
# 下载/续传
curl -C - -o "$FILENAME" "$URL"
# 验证完整性
if [ -f "$FILENAME" ]; then
COMPUTED_HASH=$(sha256sum "$FILENAME" | cut -d' ' -f1)
if [ "$COMPUTED_HASH" = "$EXPECTED_HASH" ]; then
echo "文件完整性验证通过"
else
echo "文件损坏,请重新下载"
rm -f "$FILENAME" # 删除损坏文件
fi
fi
关键说明
| 参数 | 作用 |
|---|---|
-C - |
自动从上次中断位置续传 |
-C 1000 |
从指定字节位置开始 |
-o |
指定输出文件名 |
-O |
使用远程文件名 |
-L |
跟随重定向 |
| 显示进度条 |
注意事项
- 服务器支持:续传要求服务器支持
Range请求头(常见于 HTTP/HTTPS 下载) - 文件不完整:如果文件已存在但已下载部分可能损坏,建议先删除再重下
- 进度显示:使用
-o时无法显示进度,可添加 或--progress-bar - 网络中断:Curl 的返回码 18 表示部分传输,适合重试
这种方法非常适合下载 ISO 镜像、数据集、视频等大型文件,可以避免因网络波动导致的重复下载。