You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:编写S3 Bash脚本通过文本文件批量下载对象

修复你的S3批量下载Bash脚本

你的脚本思路方向是对的,但有几个关键问题导致没达到预期效果,我帮你梳理并修正:

原脚本的问题点

  • 变量名冲突:你把第二个参数(文件名文本文件路径)赋值给了FileName,但循环里又用read -r FileName覆盖了这个变量,导致脚本无法正确读取你传入的文件名文件内容。
  • 未处理存储桶文件的遍历:你的需求是传入存储桶名称文本文件和文件名文本文件,但原脚本只尝试读取文件名文件,没有遍历存储桶文件里的每个桶。
  • 缺少错误检查:没有验证传入的两个文件是否存在,容易出现“文件不存在”的无意义报错。

修正后的脚本

#!/bin/bash

# 检查传入参数数量是否正确
if [ $# -ne 2 ]; then
    echo "用法: $0 <存储桶名称文件路径> <文件名文件路径>"
    exit 1
fi

BUCKET_FILE="$1"
FILE_NAMES_FILE="$2"

# 检查存储桶文件是否存在
if [ ! -f "$BUCKET_FILE" ]; then
    echo "错误: 存储桶文件 $BUCKET_FILE 不存在"
    exit 1
fi

# 检查文件名文件是否存在
if [ ! -f "$FILE_NAMES_FILE" ]; then
    echo "错误: 文件名文件 $FILE_NAMES_FILE 不存在"
    exit 1
fi

# 遍历每个存储桶
while IFS= read -r bucket; do
    # 跳过文件中的空行
    [[ -z "$bucket" ]] && continue
    
    echo "开始处理存储桶: $bucket"
    
    # 遍历当前存储桶下的所有目标文件
    while IFS= read -r filename; do
        # 跳过空行
        [[ -z "$filename" ]] && continue
        
        # 执行S3下载命令
        aws s3 cp "s3://${bucket}/${filename}" .
        
        # 可选:添加下载结果反馈
        if [ $? -eq 0 ]; then
            echo "✅ 成功下载: s3://${bucket}/${filename}"
        else
            echo "❌ 下载失败: s3://${bucket}/${filename}"
        fi
    done < "$FILE_NAMES_FILE"
    
    echo "存储桶 $bucket 处理完成"
done < "$BUCKET_FILE"

关键改进说明

  1. 变量分离:用BUCKET_FILE和FILE_NAMES_FILE分别存储两个输入文件的路径,彻底避免变量名冲突问题。
  2. 前置校验:添加了参数数量检查和文件存在性检查,提前抛出明确错误并退出,避免后续无效执行。
  3. 空行过滤:跳过文件中的空行,防止生成无效的S3下载路径。
  4. 状态反馈:添加了下载成功/失败的可视化提示,方便你实时跟踪执行情况。

使用方法

假设你的存储桶文件是buckets.txt(每行一个存储桶名称),文件名文件是files.txt(每行一个文件名),执行以下命令:

# 给脚本添加执行权限
chmod +x s3_batch_download.sh
# 运行脚本
./s3_batch_download.sh buckets.txt files.txt

这样脚本就会按照BucketName1/File1、BucketName1/File2...BucketNameN/FileN的格式批量下载所有指定的S3对象了。

内容的提问来源于stack exchange,提问作者zaibrockstar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 13:32:32