Ric*_*nop 7 python amazon-s3 boto amazon-web-services
假设我在S3上有不同大小的图像:
137ff24f-02c9-4656-9d77-5e761d76a273.webp
137ff24f-02c9-4656-9d77-5e761d76a273_500_300.webp
137ff24f-02c9-4656-9d77-5e761d76a273_400_280.webp
Run Code Online (Sandbox Code Playgroud)
我使用boto删除单个文件:
bucket = get_s3_bucket()
s3_key = Key(bucket)
s3_key.key = '137ff24f-02c9-4656-9d77-5e761d76a273.webp'
bucket.delete_key(s3_key)
Run Code Online (Sandbox Code Playgroud)
但是我想删除所有以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'))
Run Code Online (Sandbox Code Playgroud)
该list调用返回一个生成器,但我正在使用它将其转换为列表list,该to_delete变量现在指向存储桶中与我提供的前缀匹配的所有对象的列表.
现在,我们需要从大列表中创建最多1000个对象的块,并使用块来调用delete_keysbucket对象的方法.
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)
Run Code Online (Sandbox Code Playgroud)
有更有效的方法可以做到这一点(例如,不将桶生成器转换为列表),并且您可能希望在处理错误时执行不同的操作,但这应该为您提供一个开始.
您可以使用 aws cli 来完成:https ://aws.amazon.com/cli/和一些 unix 命令。
这个 aws cli 命令应该可以工作:
aws s3 rm <your_bucket_name> --exclude "*" --include "*137ff24f-02c9-4656-9d77-5e761d76a273*"
Run Code Online (Sandbox Code Playgroud)
如果要包含子文件夹,则应添加标志--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'
Run Code Online (Sandbox Code Playgroud)
解释:列出bucket上的所有文件--pipe--> 获取第四个参数(它的文件名)--pipe--> 使用aws cli运行删除脚本
是的。尝试使用s3cmdS3 的命令行工具。首先获取bucket中所有文件的列表。
cmd = 's3cmd ls s3://bucket_name'
args = shlex.split(cmd)
ls_lines = subprocess.check_output(args).splitlines()
Run Code Online (Sandbox Code Playgroud)
然后找到所有以您想要的字符串开头的行(使用正则表达式,应该很简单)。使用以下命令删除所有 thrm:
s3cmd del s3://bucket_name/file_name(s)
Run Code Online (Sandbox Code Playgroud)
或者,如果您只想使用单个命令:
s3cmd del s3://bucket_name/string*
Run Code Online (Sandbox Code Playgroud)
我提到了第一种方法,以便您可以测试要删除的文件的名称,并且不会意外删除其他任何内容。