假设我在S3上有不同大小的图像:
137ff24f-02c9-4656-9d77-5e761d76a273.webp
137ff24f-02c9-4656-9d77-5e761d76a273_500_300.webp
137ff24f-02c9-4656-9d77-5e761d76a273_400_280.webp
我正在使用boto删除单个文件:
bucket = get_s3_bucket()
s3_key = Key(bucket)
s3_key.key = '137ff24f-02c9-4656-9d77-5e761d76a273.webp'
bucket.delete_key(s3_key)
但我想删除所有以137ff24f-02c9-4656-9d77-5e761d76a273开头的键。
请记住,存储桶中可能有数百个文件,所以我不想遍历所有文件。有没有办法只删除以某些字符串开头的文件?
也许一些正则表达式删除功能。
S3服务确实支持多删除操作,允许您在单个API调用中最多删除1000个对象。但是,此API调用不支持密钥的服务器端过滤。您必须提供要删除的密钥列表。
你可以自己动手。首先,您需要获取要删除的所有键的列表。
import boto
s3 = boto.connect_s3()
bucket = s3.get_bucket('mybucket')
to_delete = list(bucket.list(prefix='137ff24f-02c9-4656-9d77-5e761d76a273'))
该list
调用返回一个生成器,但我正在使用list
so将该生成器转换为列表,该to_delete
变量现在指向存储桶中与我提供的前缀匹配的所有对象的列表。
现在,我们需要从大列表中创建最多1000个对象的块,并使用该块来调用delete_keys
bucket对象的方法。
for chunk in [to_delete[i:i+1000] for i in range(0, len(to_delete), 1000)]:
result = bucket.delete_keys(chunk)
if result.errors:
print('The following errors occurred')
for error in result.errors:
print(error)
有更有效的方法来执行此操作(例如,不将存储桶生成器转换为列表),并且在处理错误时您可能想做一些不同的事情,但这应该可以帮助您开始。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句