使用Shell脚本下载AWS S3指定路径下所有同名B01.tif文件咨询
S3指定文件批量下载解决方案
你原脚本的核心问题是硬编码路径层级且仅取第一个子文件夹,完全不需要写多层循环,直接用aws cli的递归遍历能力就能实现需求,完整可直接运行的脚本如下:
#!/bin/bash # 自定义配置项 TARGET_ROOT_PATH="s3://sentinel-cogs/sentinel-s2-l2a-cogs/7/V/EG/" DOWNLOAD_FILE_NAME="B01.tif" # 递归检索所有目标文件并下载 aws s3 ls "${TARGET_ROOT_PATH}" --recursive --no-sign-request | grep "${DOWNLOAD_FILE_NAME}" | while read -r file_info; do # 提取文件在桶内的相对路径,拼接成完整S3路径 relative_path=$(echo "${file_info}" | awk '{print $4}') full_s3_path="${TARGET_ROOT_PATH}${relative_path}" # 提取B01.tif所在的父文件夹名称,用于生成保存文件名 parent_folder=$(echo "${full_s3_path}" | awk -F '/' '{print $(NF-1)}') save_name="${parent_folder}${DOWNLOAD_FILE_NAME}" # 执行下载 echo "下载中:${full_s3_path} -> ${save_name}" aws s3 cp "${full_s3_path}" --no-sign-request "./${save_name}" done
脚本说明
- 自动递归遍历根路径下所有年份、月份、子目录,无需手动调整循环层级
- 命名规则完全匹配需求:自动提取B01.tif的父文件夹名拼接成最终文件名,比如示例路径会生成
S2A_7VEG_20170205_0_L2AB01.tif - 所有请求自动加无凭证参数,适配公开存储桶的访问要求
可选调整项
- 如需限定仅下载指定年份/月份的文件,修改
TARGET_ROOT_PATH即可,例如下载2017年的文件就改为s3://sentinel-cogs/sentinel-s2-l2a-cogs/7/V/EG/2017/ - 如需修改本地保存目录,将
./${save_name}中的./替换为目标文件夹绝对路径即可 - 如需跳过已存在的文件避免重复下载,可以在cp命令中加
--no-clobber参数
内容的提问来源于stack exchange,提问作者Nihilum
相关产品推荐
相关产品推荐

