使用ossutil包装脚本下载数据

最近在下载数据,包装个函数download_from_oss.sh

#!/bin/bash

# ossutil 下载数据函数,支持断点续传和按文件逐个下载
# 用法: ./download_from_oss.sh <oss_bucket_path> <local_target_path>

download_from_oss() {
    # 检查是否提供了 OSS 存储桶路径和本地存储路径
    if [ -z "$1" ] || [ -z "$2" ]; then
        echo "❌ 错误:请提供 OSS 存储桶路径和本地存储目录"
        echo "用法: ./download_from_oss.sh <oss_bucket_path> <local_target_path>"
        return 1
    fi

    OSS_PATH=$1  # OSS 路径
    LOCAL_PATH=$2  # 本地存储路径

    # 确保本地目录存在
    mkdir -p "$LOCAL_PATH"

    # 使用 ossutil 列出 OSS 中的所有文件
    echo "⏳ 正在列出 OSS 文件:$OSS_PATH"
    ossutil64 ls "$OSS_PATH" | while read line; do
        # 排除包含无效信息的行(如 Object Number 或 elapsed 等信息)
        if [[ -n "$line" && ! "$line" =~ ^(Object|elapsed) ]]; then
            # 输出调试信息
            echo "调试: 处理行:$line"

            # 提取 OSS 文件路径(按空格分割,最后一列是路径)
            FILE_PATH=$(echo $line | awk '{print $NF}')

            # 如果文件路径有效,继续处理
            if [ -n "$FILE_PATH" ]; then
                # 确保路径以 oss:// 开头,并去掉 "oss://"
                if [[ "$FILE_PATH" =~ ^oss:// ]]; then
                    FILE_PATH=${FILE_PATH#oss://}  # 去掉 "oss://"
                    FILE_NAME=$(basename "$FILE_PATH")

                    # 创建本地目录,保持原有 OSS 结构
                    LOCAL_FILE_PATH="$LOCAL_PATH/$(dirname "$FILE_PATH")"
                    mkdir -p "$LOCAL_FILE_PATH"

                    # 检查本地是否已存在该文件,且文件大小是否一致
                    if [ -f "$LOCAL_FILE_PATH/$FILE_NAME" ]; then
                        REMOTE_SIZE=$(echo $line | awk '{print $3}')
                        LOCAL_SIZE=$(stat --format="%s" "$LOCAL_FILE_PATH/$FILE_NAME")

                        # 如果文件大小一致,跳过下载
                        if [ "$REMOTE_SIZE" -eq "$LOCAL_SIZE" ]; then
                            echo "✅ 文件已存在,跳过下载:$FILE_NAME"
                            continue
                        fi
                    fi

                    # 下载文件(自动支持断点续传)
                    echo "⏳ 正在下载文件:$FILE_PATH"
                    ossutil64 cp "oss://$FILE_PATH" "$LOCAL_FILE_PATH/$FILE_NAME"

                    # 检查下载是否成功
                    if [ $? -eq 0 ]; then
                        echo "✅ 下载成功:$FILE_NAME"
                    else
                        echo "❌ 下载失败:$FILE_NAME"
                    fi
                fi
            fi
        fi
    done
}

# 调用函数,并传递命令行参数
download_from_oss "$1" "$2"
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容