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

能否将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 02:05:07