首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何删除S3文件

如何删除S3文件
EN

Stack Overflow用户
提问于 2014-02-19 13:58:29
回答 5查看 13.7K关注 0票数 10

假设我在S3上有不同大小的图像:

代码语言:javascript
运行
复制
137ff24f-02c9-4656-9d77-5e761d76a273.webp
137ff24f-02c9-4656-9d77-5e761d76a273_500_300.webp
137ff24f-02c9-4656-9d77-5e761d76a273_400_280.webp

我使用boto删除一个文件:

代码语言:javascript
运行
复制
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开头的键。

请记住,桶中可能有数百个文件,所以我不想遍历所有文件。是否有方法只删除以特定字符串开头的文件?

也许是一些regex删除函数。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-02-19 15:19:30

S3服务确实支持多删除操作,允许您在单个API调用中删除多达1000个对象。但是,这个API调用不支持服务器端对键的过滤.您必须提供要删除的密钥列表。

你可以自己滚。首先,您需要获得要删除的所有键的列表。

代码语言:javascript
运行
复制
import boto

s3 = boto.connect_s3()
bucket = s3.get_bucket('mybucket')
to_delete = list(bucket.list(prefix='137ff24f-02c9-4656-9d77-5e761d76a273'))

list调用返回一个生成器,但我使用list将其转换为一个列表,因此,to_delete变量现在指向桶中与我提供的前缀匹配的所有对象的列表。

现在,我们需要从大列表中创建多达1000个对象的块,并使用这个块来调用桶对象的delete_keys方法。

代码语言:javascript
运行
复制
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)

有更有效的方法来做到这一点(例如,不将桶生成器转换为列表),并且您可能希望在处理错误时做一些不同的事情,但是这应该会给您一个开始。

票数 9
EN

Stack Overflow用户

发布于 2019-03-17 09:14:36

您可以使用aws:https://aws.amazon.com/cli/和一些unix命令来完成它。

这个aws命令应该可以工作:

代码语言:javascript
运行
复制
aws s3 rm <your_bucket_name> --exclude "*" --include "*137ff24f-02c9-4656-9d77-5e761d76a273*" 

如果要包含子文件夹,则应添加标志--递归

或使用unix命令:

代码语言:javascript
运行
复制
aws s3 ls s3://<your_bucket_name>/ | awk '{print $4}' | xargs -I%  <your_os_shell>   -c 'aws s3 rm s3:// <your_bucket_name>  /% $1'

说明:列出桶上的所有文件--pipe->获取第四个参数(文件名)--pipe->运行删除脚本

票数 9
EN

Stack Overflow用户

发布于 2014-02-19 14:16:34

是。尝试使用s3cmd,S3的命令行工具。首先获取桶中所有文件的列表。

代码语言:javascript
运行
复制
cmd = 's3cmd ls s3://bucket_name'
args = shlex.split(cmd)
ls_lines = subprocess.check_output(args).splitlines()

然后查找以所需字符串开头的所有行(使用regex,应该很简单)。使用以下命令删除所有thrm:

代码语言:javascript
运行
复制
s3cmd del s3://bucket_name/file_name(s)

或者,如果您只想使用一个命令:

代码语言:javascript
运行
复制
s3cmd del s3://bucket_name/string*

我提到了第一种方法,这样您就可以测试要删除的文件的名称,并且不会意外地删除任何其他内容。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21882686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档