如何通过Crontab使用AWS CLI同步S3中2年内的文件?
实现S3存储桶近两年文件的定时同步
核心思路
通过Shell脚本动态生成同步工具的--include规则,精准匹配文件名中日期部分属于近两年的文件,结合Crontab实现定时同步,全程无需依赖find或mtime参数。
具体步骤
- 编写同步脚本
创建名为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://你的存储桶名称/ /本地同步路径/
- 赋予脚本执行权限
chmod +x /path/to/s3_sync_recent.sh
- 配置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
相关产品推荐
相关产品推荐

