脚本中Curl下载大文件如何续传

wen 实用脚本 6

本文目录导读:

脚本中Curl下载大文件如何续传

  1. 基础续传命令
  2. 完整的脚本示例
  3. 带重试机制的脚本
  4. 带进度显示的版本
  5. 验证下载完整性
  6. 关键说明
  7. 注意事项

在脚本中使用 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 跟随重定向
显示进度条

注意事项

  1. 服务器支持:续传要求服务器支持 Range 请求头(常见于 HTTP/HTTPS 下载)
  2. 文件不完整:如果文件已存在但已下载部分可能损坏,建议先删除再重下
  3. 进度显示:使用 -o 时无法显示进度,可添加 或 --progress-bar
  4. 网络中断:Curl 的返回码 18 表示部分传输,适合重试

这种方法非常适合下载 ISO 镜像、数据集、视频等大型文件,可以避免因网络波动导致的重复下载。

抱歉,评论功能暂时关闭!