如何使用Python+Boto3删除S3存储桶内除当日文件外的历史文件
S3 历史文件夹查找与文件删除实现方案
核心逻辑
- 先生成当日对应的
年/月/日格式路径前缀,作为唯一排除项 - 遍历桶内所有按日期生成的三级目录前缀,和当日前缀做匹配,不一致的即为待处理的历史文件夹
- 批量删除所有历史前缀下的存储对象
Python(boto3)代码实现
前提:已安装boto3,且环境配置好对应S3桶的读写权限
import boto3 from datetime import datetime # 配置项 BUCKET_NAME = "替换为你的桶名" s3_client = boto3.client("s3") # 生成当日日期前缀,格式为 year/month/day/ today_date_prefix = datetime.today().strftime("%Y/%m/%d") + "/" history_prefix_list = [] # 遍历所有三级日期目录 # 先遍历第一级:年目录 year_paginator = s3_client.get_paginator("list_objects_v2") for year_page in year_paginator.paginate(Bucket=BUCKET_NAME, Delimiter="/"): for year_item in year_page.get("CommonPrefixes", []): year_prefix = year_item["Prefix"] # 遍历第二级:月目录 month_resp = s3_client.list_objects_v2(Bucket=BUCKET_NAME, Prefix=year_prefix, Delimiter="/") for month_item in month_resp.get("CommonPrefixes", []): month_prefix = month_item["Prefix"] # 遍历第三级:日目录 day_resp = s3_client.list_objects_v2(Bucket=BUCKET_NAME, Prefix=month_prefix, Delimiter="/") for day_item in day_resp.get("CommonPrefixes", []): day_prefix = day_item["Prefix"] # 排除当日目录,收集所有历史目录前缀 if day_prefix != today_date_prefix: history_prefix_list.append(day_prefix) # 批量删除历史目录下的文件 for delete_prefix in history_prefix_list: delete_paginator = s3_client.get_paginator("list_objects_v2") for delete_page in delete_paginator.paginate(Bucket=BUCKET_NAME, Prefix=delete_prefix): if "Contents" in delete_page: delete_keys = [{"Key": obj["Key"]} for obj in delete_page["Contents"]] s3_client.delete_objects(Bucket=BUCKET_NAME, Delete={"Objects": delete_keys})
提示:测试阶段可以先把删除操作替换成打印待删除的key,确认筛选逻辑完全正确后再执行真实删除,避免误删数据
AWS CLI 快速实现
如果不需要复杂自定义逻辑,直接用CLI命令即可完成操作:
# 生成当日日期前缀 TODAY_PREFIX=$(date +"%Y/%m/%d/") # 测试:查看待删除文件列表 aws s3 rm s3://替换为你的桶名/ --recursive --exclude "${TODAY_PREFIX}*" --dryrun # 确认无误后,去掉--dryrun执行真实删除
小提示:如果桶内文件量极大,建议使用S3批量删除任务提升执行效率,避免长耗时。
内容的提问来源于stack exchange,提问作者wawawa
相关产品推荐
相关产品推荐

