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

如何通过Crontab使用AWS CLI同步S3中2年内的文件?

实现S3存储桶近两年文件的定时同步

核心思路

通过Shell脚本动态生成同步工具的--include规则,精准匹配文件名中日期部分属于近两年的文件,结合Crontab实现定时同步,全程无需依赖find或mtime参数。

具体步骤

  1. 编写同步脚本
    创建名为s3_sync_recent.sh的脚本,内容如下:
#!/bin/bash
# 计算两年前的基准日期(格式:YYYYMMDD)
START_DATE=$(date --date='2 years ago' '+%Y%m%d')
# 拆分基准日期的年、月、日
START_YEAR=${START_DATE:0:4}
START_MONTH=${START_DATE:4:2}
START_DAY=${START_DATE:6:2}

# 获取当前年份
CURRENT_YEAR=$(date '+%Y')

# 初始化include规则数组
INCLUDE_RULES=()

# 包含基准年份之后的所有完整年份的文件(比如2023、2024)
for ((year=START_YEAR+1; year<=CURRENT_YEAR; year++)); do
    INCLUDE_RULES+=("--include=${year}*-*")
done

# 包含基准年份中,基准日期当天及之后的日期文件
for ((day=START_DAY; day<=31; day++)); do
    DAY_STR=$(printf "%02d" $day)
    INCLUDE_RULES+=("--include=${START_YEAR}${START_MONTH}${DAY_STR}-*")
done

# 包含基准年份中,基准月份之后的所有月份的文件
for ((month=START_MONTH+1; month<=12; month++)); do
    MONTH_STR=$(printf "%02d" $month)
    INCLUDE_RULES+=("--include=${START_YEAR}${MONTH_STR}??-*")
done

# 执行同步:先排除所有文件,再按规则包含目标文件
s3cmd sync --exclude="*" "${INCLUDE_RULES[@]}" s3://你的存储桶名称/ /本地同步路径/
  1. 赋予脚本执行权限
chmod +x /path/to/s3_sync_recent.sh
  1. 配置Crontab定时任务
    编辑Crontab配置:
crontab -e

添加定时规则(示例为每天凌晨2点执行同步,输出日志到指定文件):

0 2 * * * /path/to/s3_sync_recent.sh >> /var/log/s3_sync.log 2>&1

补充说明

  • 脚本通过字符串匹配文件名的前8位日期(YYYYMMDD格式),利用Shell循环动态生成符合近两年范围的--include规则,确保仅同步目标文件。
  • 无需担心不存在的日期(如20220230),因为存储桶中没有对应文件,不会影响同步结果。
  • 若使用AWS CLI而非s3cmd,只需将s3cmd sync替换为aws s3 sync,参数规则保持一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 18:20:59