求助:编写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"
关键改进说明
- 变量分离:用
BUCKET_FILE和FILE_NAMES_FILE分别存储两个输入文件的路径,彻底避免变量名冲突问题。 - 前置校验:添加了参数数量检查和文件存在性检查,提前抛出明确错误并退出,避免后续无效执行。
- 空行过滤:跳过文件中的空行,防止生成无效的S3下载路径。
- 状态反馈:添加了下载成功/失败的可视化提示,方便你实时跟踪执行情况。
使用方法
假设你的存储桶文件是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
相关产品推荐
相关产品推荐

