如何删除以。开头的S3文件

问题描述 投票:6回答:5

假设我在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开头的密钥。

请记住,存储桶中可能有数百个文件,因此我不想迭代所有文件。有没有办法只删除以某些字符串开头的文件?

也许一些正则表达式删除功能。

python amazon-web-services amazon-s3 boto
5个回答
8
投票

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将其转换为列表,因此,to_delete变量现在指向存储桶中与我提供的前缀匹配的所有对象的列表。

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

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)

有更有效的方法可以做到这一点(例如,不将桶生成器转换为列表),并且您可能希望在处理错误时执行不同的操作,但这应该为您提供一个开始。


3
投票

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

cmd = 's3cmd ls s3://bucket_name'
args = shlex.split(cmd)
ls_lines = subprocess.check_output(args).splitlines()

查找以所需字符串开头的所有行(使用正则表达式,应该很简单)。使用以下命令删除所有thrm:

s3cmd del s3://bucket_name/file_name(s)

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

s3cmd del s3://bucket_name/string*

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


1
投票

虽然没有直接的boto方法来做你想要的,你应该能够通过使用get_all_keys有效地做,用所述正则表达式过滤它们,然后调用delete_keys

这样做只会使用两个请求,而正则表达式客户端应该非常快


1
投票

对于boto3,以下代码段将删除以特定前缀开头的所有文件:

import boto3

botoSession = boto3.Session(
    aws_access_key_id     = <your access key>,
    aws_secret_access_key = <your secret key>,
    region_name           = <your region>,
)

s3 = botoSession.resource('s3')
bucket = s3.Bucket(bucketname)
objects = bucket.objects.filter(Prefix=<your prefix>)
objects.delete()

0
投票

你可以使用aws cli:https://aws.amazon.com/cli/和一些unix命令来做到这一点。

这个aws cli命令应该工作:

aws s3 rm <your_bucket_name> --exclude "*" --include "*137ff24f-02c9-4656-9d77-5e761d76a273*" 

如果你想包含子文件夹,你应该添加标志--recursive

或使用unix命令:

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 - >获取第4个参数(其文件名)--pipe - >使用aws cli运行删除脚本

© www.soinside.com 2019 - 2024. All rights reserved.