项目产品
开发者文档 / 6 分钟阅读

通用配置项,按实际信息填写

一、结论

S3批量删除文件通过脚本实现的核心思路是调用S3 API的批量删除接口,提前准备好S3身份认证信息和待删除文件规则,使用Python、Shell等常用脚本语言即可快速完成,无需手动逐页删除,能大幅提升大数量级文件的清理效率。操作前需要准备Endpoint、AccessKey、SecretKey、Bucket、Region等核心接入信息,在脚本中完成配置并测试连接后即可执行。

二、准备工作

  • S3兼容对象存储的有效账号,且账号拥有目标存储桶的删除权限
  • 目标存储桶Bucket名称
  • 对象存储服务提供的Endpoint地址
  • 有权限操作目标存储桶的AccessKey
  • 对应AccessKey的SecretKey
  • 目标存储桶所属的Region信息
  • 本地提前配置好脚本运行环境(Python3+ boto3库 或 AWS CLI工具二选一即可)
  • 提前确认删除规则:是全桶删除、按前缀/后缀删除、按上传时间筛选删除还是指定文件列表删除
  • 重要文件提前完成备份,避免误删造成数据损失

三、操作步骤

1. 配置本地S3运行环境:使用Python的用户执行pip install boto3安装依赖库,使用AWS CLI的用户先通过aws configure命令完成基础信息初始化,配置完成后执行一次存储桶文件列表查询操作,确认可以正常连接到目标存储桶。

2. 确认删除规则并核对待删除文件:根据业务需求确定删除筛选条件,比如删除前缀为“temp/”的临时文件、删除上传时间早于30天的日志文件等,先执行一次查询操作输出待删除文件清单,核对清单和预期删除的文件完全一致后再进入删除环节。

3. 编写或调整批量删除脚本:把提前准备的Endpoint、AccessKey、SecretKey、Bucket、Region等信息填入脚本对应配置项,同时配置好筛选规则,若需要删除指定文件则提前把Object Key列表导入脚本。

4. 执行测试模式验证:将脚本的dry run(测试模式)开关打开,此时脚本只会输出待删除文件清单不会实际执行删除操作,再次核对清单无误后再关闭测试模式。

5. 正式执行批量删除:关闭测试模式后运行脚本,当待删除文件数量超过1000时,脚本会自动按每批次最多1000个文件的规则分批次执行(符合S3 API的批量删除上限),执行过程中可实时查看删除进度。

6. 验证删除结果:脚本执行完成后,再次查询目标存储桶的文件列表,确认符合删除规则的文件已经全部清理完成,若有残留文件可调整规则后二次执行。

7. 定时任务配置(可选):如果是需要定期清理的场景(比如每日清理过期日志、临时缓存文件),可以把调试完成的脚本设置为系统定时任务,无需手动重复执行。

四、常见错误

  • Endpoint填写错误:比如误拼接存储桶前缀、使用了非对应服务的Endpoint地址,导致脚本无法连接到存储服务,解决方法是核对服务商提供的官方Endpoint地址,直接填写完整域名即可,不需要额外拼接存储桶名称。
  • AccessKey或SecretKey权限不足:脚本执行时返回403错误,解决方法是检查密钥对应的账号是否有目标存储桶的删除权限,尽量使用仅分配了对应存储桶操作权限的子账号密钥,避免使用根账号密钥提升安全性。
  • 删除规则配置错误:比如前缀少写了路径分隔符、时间范围设置错误,导致误删正常文件,解决方法是每次执行删除前必须运行dry run模式核对待删除清单,重要文件操作前必须完成备份。
  • 单次删除文件数量超过API限制:S3批量删除接口单次最多支持删除1000个文件,超过该数量会返回报错,解决方法是在脚本中设置分批次处理逻辑,每批次最多处理999个文件,分批执行即可。
  • Region填写不匹配:部分S3服务要求严格对应Region参数,填错会导致连接失败,解决方法是核对服务商给出的对应存储桶所属Region代码,按要求填写即可。
  • 开启版本控制的存储桶删除后空间未释放:仅删除文件的最新版本不会清理历史版本,存储空间不会被释放,解决方法是在脚本中添加删除所有版本的参数,才能彻底清理文件释放空间。

五、示例说明

以下是基于Python boto3库的通用批量删除脚本示例,可根据自身需求调整筛选规则:

```python

import boto3

from botocore.config import Config

from datetime import datetime, timedelta

s3_config = Config(

s3={'addressing_style': 'path'}, # 部分服务商要求path模式,可根据实际调整

region_name = '填写对应存储桶的Region代码'

)

s3_client = boto3.client(

's3',

endpoint_url = '填写对象存储服务提供的Endpoint地址',

aws_access_key_id = '填写你的AccessKey',

aws_secret_access_key = '填写你的SecretKey',

config = s3_config

)

bucket_name = '填写目标存储桶名称'

示例规则:删除前缀为temp/、上传时间早于30天的文件,可自行调整规则

prefix = '需要删除的文件前缀,比如temp/'

expire_days = 30

is_dry_run = True # 测试模式设为True,正式执行改为False

批量查询待删除文件

response = s3_client.list_objects_v2(Bucket=bucket_name, Prefix=prefix)

if 'Contents' not in response:

print("没有找到符合规则的待删除文件")

exit()

按时间筛选待删除文件

expire_time = datetime.now() - timedelta(days=expire_days)

to_delete = []

for obj in response['Contents']:

if obj['LastModified'].replace(tzinfo=None) < expire_time:

to_delete.append({'Key': obj['Key']})

print(f"待删除文件数量:{len(to_delete)}")

if is_dry_run:

print("当前为测试模式,不会实际删除文件,待删除文件列表:")

for obj in to_delete:

print(obj['Key'])

else:

分批次删除,每批次最多1000个

for i in range(0, len(to_delete), 1000):

batch = to_delete[i:i+1000]

s3_client.delete_objects(Bucket=bucket_name, Delete={'Objects': batch})

print("批量删除执行完成")

```

六、更简单的方案

如果不想自己维护脚本、不想处理复杂的S3 API适配,或者需要更稳定的对象存储服务承载业务文件,也可以直接选择成熟的兼容S3协议的云对象存储服务,大部分主流云存储控制台都自带批量删除、生命周期规则设置等功能,不需要自己写脚本就能实现定期自动清理过期文件、按规则批量删除等需求。如果你需要一个兼容S3协议、适合程序接入、图床、网盘系统存储源和下载分发的对象存储服务,可以了解 七彩云对象存储,支持通过控制台直接设置生命周期规则,不需要自行开发脚本即可实现自动批量删除指定规则的文件,降低运维成本。

七、FAQ

Q:批量删除的文件可以恢复吗?

A:如果你的存储桶没有开启版本控制或者回收站功能,删除后的文件无法恢复,所以执行删除操作前一定要核对待删除清单,重要文件提前备份;如果开启了版本控制或者回收站,可以在服务设置的保留期内恢复误删的文件。

Q:有几十万甚至上百万文件需要删除,脚本运行会不会超时?

A:S3的批量删除逻辑是直接调用服务端接口,只传输控制指令不传输文件本身,只要在脚本中设置分批次处理,每批次执行完成后再处理下一批,就不会出现超时问题,百万级文件也可以顺利完成删除。

Q:除了Python脚本,有没有更简单的批量删除方法?

A:可以使用AWS CLI工具,配置好S3接入信息后,直接使用aws s3 rm s3://bucket-name/prefix/ --recursive命令即可批量删除指定前缀的文件,不需要自行编写代码,适合对脚本开发不熟悉的用户。

Q:批量删除会不会占用大量本地带宽?

A:批量删除操作只需要在本地和存储服务之间传输控制指令,不需要传输文件本身,所以不会占用大量本地带宽,对本地设备的算力要求也很低,普通个人电脑就可以执行百万级文件的删除任务。

八、总结

S3批量删除文件通过脚本实现的流程非常清晰,只需要提前准备好S3接入信息,确定好删除规则,经过测试无误后即可执行,适合需要清理大量过期文件、定期删除临时文件的站长、开发者使用,不管是自建MinIO存储还是使用公有云对象存储,都可以通过这套方法快速实现批量删除,无需手动逐页操作大幅提升效率。如果不想自行维护脚本,也可以选择自带生命周期管理功能的S3兼容对象存储服务,直接在控制台配置规则即可实现自动批量删除,进一步降低运维成本。

想进一步了解这个项目?

访问官网查看产品能力、适用场景和最新服务信息。

访问官网

相关文章

开发者文档 / / 8 分钟阅读

S3 ListObjects接口使用方法

一、结论 S3 ListObjects(及迭代版本ListObjectsV2)是标准S3协议下用于列举存储桶内对象的核心接口,接入调用前需提前准备Endpoint、AccessKey、SecretKey、Bucket、Region等核心身份与配置参数,可通过兼容S3的SDK、命令行工具或第三方程序调用,满足对象批量查询、自动化文件管理、存储资源盘点等需求。

开发者文档 / / 8 分钟阅读

Node.js怎么调用S3接口实现大文件分片上传

一、结论 Node.js调用S3接口实现大文件分片上传,核心是使用兼容标准S3协议的官方或第三方SDK,提前准备好Endpoint、AccessKey、SecretKey、Bucket、Region等核心参数,按照分片初始化、分片上传、分片合并的标准流程调用接口即可实现,不需要适配私有API,可直接对接所有支持S3协议的对象存储服务。

开发者文档 / / 7 分钟阅读

Go语言实现大文件分片上传到S3的代码示例

一、结论 使用Go语言实现大文件分片上传到S3兼容对象存储,核心是先获取对应存储服务的Endpoint、AccessKey、SecretKey、Bucket、Region等核心配置,再基于标准S3协议的官方SDK开发上传逻辑即可,所有兼容S3协议的对象存储服务都可以通用这套实现,不需要额外适配非标准接口。

开发者文档 / / 7 分钟阅读

ThinkPHP项目怎么接入S3兼容存储

一、结论 ThinkPHP项目接入S3兼容存储的核心逻辑是基于标准S3协议对接,无需适配私有接口,只需提前获取Endpoint、AccessKey、SecretKey、Bucket、Region这5项核心参数,即可通过兼容S3的SDK、第三方扩展或程序插件完成配置,实现文件上传、下载、外链分发、批量管理等全量功能,所有支持标准S3协议的存储服务均可通用对接。

开发者文档 / / 7 分钟阅读

前端页面大文件直传S3怎么实现

一、结论 前端页面实现大文件直传S3的核心思路是让前端直接与S3兼容存储服务交互,无需经过业务服务器中转,可大幅节省自身服务器带宽与存储资源。操作前需提前准备好S3协议所需的Endpoint、AccessKey、SecretKey、Bucket、Region等配置信息,完成权限和跨域配置后即可接入前端上传逻辑实现大文件传输。