最近在下载数据,包装个函数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"