能否将Bash格式化日期传入AWS S3 CLI cp命令的--include参数?
使用AWS CLI结合Bash自动下载S3中上周的文件
完全可行,下面分两种常见场景给出实现方案:
场景1:按文件名/路径中的日期字符串筛选
如果你的S3文件路径或文件名里包含明确的日期格式(比如YYYY-MM-DD),可以直接用AWS CLI的--include/--exclude参数配合Bash生成的日期列表来筛选:
步骤1:用Bash生成过去7天的日期
- 针对Linux(GNU Date):
# 生成过去7天的日期数组 INCLUDE_ARGS=() for i in {0..6}; do DATE=$(date -d "$i days ago" +%Y-%m-%d) INCLUDE_ARGS+=("--include" "*$DATE*") done - 针对macOS(BSD Date):
INCLUDE_ARGS=() for i in {0..6}; do DATE=$(date -v -"$i"d +%Y-%m-%d) INCLUDE_ARGS+=("--include" "*$DATE*") done
步骤2:执行S3同步/复制
用aws s3 sync(推荐,会跳过已存在的文件)或者aws s3 cp来下载,注意必须先写--exclude "*",再写--include规则,因为AWS CLI的筛选规则是按顺序生效的:
aws s3 sync s3://your-bucket/target-folder/ ./local-download-folder/ \ --exclude "*" \ "${INCLUDE_ARGS[@]}"
场景2:按文件最后修改时间筛选
如果文件名里没有日期,或者需要严格按文件的实际修改时间筛选上周的文件,就得用aws s3api先列出符合条件的文件,再逐个复制:
# 计算一周前的Unix时间戳(秒) ONE_WEEK_AGO=$(date -d "1 week ago" +%s) # 列出S3桶中最后修改时间晚于一周前的文件,然后逐个下载 aws s3api list-objects-v2 --bucket your-bucket --prefix target-folder/ | \ jq -r '.Contents[] | select(.LastModified | sub("\\..*Z$";"Z") | fromdateiso8601 > '$ONE_WEEK_AGO') | .Key' | \ while read -r FILE_KEY; do aws s3 cp "s3://your-bucket/$FILE_KEY" "./local-download-folder/$FILE_KEY" # 可选:自动创建对应本地目录(适配S3子路径结构) # mkdir -p "./local-download-folder/$(dirname "$FILE_KEY")" done
注意事项
- 不同系统的
date命令参数有差异,按需调整 - 使用
jq需要提前安装(Linux用apt install jq,macOS用brew install jq) - 自动化执行可将脚本加入Cron(Linux)或Launchd(macOS)定时运行
内容的提问来源于stack exchange,提问作者Kyle
相关产品推荐
相关产品推荐

