Подтвердить что ты не робот

Amazon S3 boto - как удалить папку?

Я создал папку в s3 с именем "test" и вставил "test_1.jpg", "test_2.jpg" в "test".

Как я могу использовать boto для удаления папки "test"?

4b9b3361

Ответ 1

В S3 нет папок. Вместо этого ключи образуют плоское пространство имен. Однако ключ с косой чертой в названии специально показан в некоторых программах, включая консоль AWS (см., Например, Amazon S3 boto - как создать папку?).

Вместо удаления "директории" вы можете (и должны) перечислить файлы по префиксу и удалить. По сути:

for key in bucket.list(prefix='your/directory/'):
    key.delete()

Однако другие завершенные ответы на этой странице содержат более эффективные подходы.


Обратите внимание, что префикс просто ищется с помощью поиска фиктивной строки. Если бы префиксом был your/directory, то есть без добавленной косой черты, программа также удачно your/directory-that-you-wanted-to-remove-is-definitely-not-t‌​his-one бы your/directory-that-you-wanted-to-remove-is-definitely-not-t‌​his-one.

Для получения дополнительной информации см. Раздел S3 boto list keys иногда возвращает ключ каталога.

Ответ 2

Я чувствую, что это было какое-то время, и у boto3 есть несколько разных способов достижения этой цели. Предполагается, что вы хотите удалить папку test "и все ее объекты. Вот один из способов:

s3 = boto3.resource('s3')
objects_to_delete = s3.meta.client.list_objects(Bucket="MyBucket", Prefix="myfolder/test/")

delete_keys = {'Objects' : []}
delete_keys['Objects'] = [{'Key' : k} for k in [obj['Key'] for obj in objects_to_delete.get('Contents', [])]]

s3.meta.client.delete_objects(Bucket="MyBucket", Delete=delete_keys)

Это должно сделать два запроса: один для извлечения объектов в папке, второй - для удаления всех объектов в указанной папке.

https://boto3.readthedocs.org/en/latest/reference/services/s3.html#S3.Client.delete_objects

Ответ 3

Вот версия 2018 (почти 2019):

s3 = boto3.resource('s3')
bucket = s3.Bucket('mybucket')
bucket.objects.filter(Prefix="myprefix/").delete()

Ответ 4

Вы можете использовать bucket.delete_keys() со списком ключей (с большим количеством ключей я нашел, что это порядок на величину быстрее, чем при использовании key.delete).

Что-то вроде этого:

delete_key_list = []
for key in bucket.list(prefix='/your/directory/'):
    delete_key_list.append(key)
    if len(delete_key_list) > 100:
        bucket.delete_keys(delete_key_list)
        delete_key_list = []

if len(delete_key_list) > 0:
    bucket.delete_keys(delete_key_list)

Ответ 5

Небольшое улучшение по решению Патрика. Как вы, возможно, знаете, оба параметра list_objects() и delete_objects() имеют ограничение объекта 1000. Вот почему вам нужно разбивать страницы на разделы и удалять их в кусках. Это довольно универсально, и вы можете дать Prefix paginator.paginate() для удаления подкаталогов/путей

client = boto3.client('s3', **credentials)
paginator = client.get_paginator('list_objects_v2')
pages = paginator.paginate(Bucket=self.bucket_name)

delete_us = dict(Objects=[])
for item in pages.search('Contents'):
    delete_us['Objects'].append(dict(Key=item['Key']))

    # flush once aws limit reached
    if len(delete_us['Objects']) >= 1000:
        client.delete_objects(Bucket=bucket, Delete=delete_us)
        delete_us = dict(Objects=[])

# flush rest
if len(delete_us['Objects']):
    client.delete_objects(Bucket=bucket, Delete=delete_us)

Ответ 6

Вы можете сделать это, используя aws cli: https://aws.amazon.com/cli/ и некоторую команду unix.

это aws cli команды должны работать:

aws s3 rm <your_bucket_name> --recursive --exclude "*" --include "<your_regex>" 

если вы хотите включить подпапки, вы должны добавить флаг --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'

объяснение:

  1. список всех файлов в корзине --pipe ->
  2. получить 4-й параметр (это имя файла) --pipe ->//вы можете заменить его командой linux, чтобы соответствовать вашему шаблону
  3. запустить скрипт удаления с помощью aws cli