如何使用AWS CLI在S3存储桶中一次删除多个图像

时间:2019-04-04 14:11:59

标签: amazon-web-services amazon-s3 aws-cli

我有一个名为uploads的s3存储桶,其中包含数百万个图像,我想从这些图像中删除特定名称。

E.g 
Anyimagesname-100x70.jpg
Anyimagesname-218x150.jpg
Anyimagesname-324x160.jpg
....

然后我有一个专门处理删除此类文件的脚本:

# !/bin/bash
for imageWithSize in $(find . -regextype posix-extended -regex ".*-[[:digit:]]{1,9}x[[:digit:]]{1,9}(@2x)?.(jpg|jpeg|png|eps|gif)" -type f); do
    echo rm $imageWithSize >> result.txt
    rm $imageWithSize
done

但是我不知道如何使用AWS S3 Cli。

也许是这样的:

aws s3 rm s3://uploads/ --dryrun --recursive --exclude "*" --include ".*-[[:digit:]]{1,9}x[[:digit:]]{1,9}(@2x)?.(jpg|jpeg|png|eps|gif)"

这行吗?

1 个答案:

答案 0 :(得分:0)

否,AWS CLI无法接受复杂的正则表达式。

您可以编写如下脚本:

import boto3
import re

BUCKET = 'my-bucket'

s3_client = boto3.client('s3', region_name='ap-southeast-2')

response = s3_client.list_objects_v2(Bucket=BUCKET)

# Get a list of object Keys
keys = [object['Key'] for object in response['Contents']]

# Find keys like: Anyimagesname-100x70.jpg
pattern = '.*-[\d]{1,9}x[\d]{1,9}(@2x)?.(jpg|jpeg|png|eps|gif)'
keys_to_delete = [key for key in keys if re.search(pattern, key)]

print(keys_to_delete)

# Delete them!
keys_dict = [{'Key':key} for key in keys_to_delete]
if keys_dict:
    s3_client.delete_objects(Bucket=BUCKET, Delete={'Objects': keys_dict})

请注意,list_objects_v2()一次返回1000个对象,因此,如果您有更多文件,则需要使用ContinuationToken添加分页代码。