Как удалить несколько изображений одновременно в корзине S3 с помощью AWS CLI - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть корзина s3 с именем uploads с миллионами изображений, я хочу удалить конкретные имена из этих изображений.

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 голосов
/ 04 апреля 2019

Нет, интерфейс командной строки AWS не может принимать сложные выражения регулярных выражений.

Вы можете написать такой скрипт:

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.

...