Amazon S3 boto - ¿cómo eliminar la carpeta?


He creado una carpeta en s3, llamada "test" y presiono "test_1.jpg", " test_2.jpg " en "prueba".

Ahora quiero usar boto para eliminar la carpeta "test".

¿Qué debo hacer?

Author: wade huang, 2012-07-11

4 answers

No hay carpetas en S3. En su lugar, las claves forman un espacio de nombres plano. Sin embargo, una clave con barras en su nombre se muestra especialmente en algunos programas, incluida la consola de AWS (consulte, por ejemplo, Amazon S3 boto - ¿cómo crear una carpeta?).

En lugar de eliminar "un directorio", puede (y tiene que) listar archivos por prefijo y eliminar. En esencia:

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

Sin embargo, las otras respuestas logradas en esta página cuentan con enfoques más eficientes.


Aviso que el prefijo se busca usando la búsqueda de cadenas ficticias. Si el prefijo era your/directory, es decir, sin la barra final anexada, el programa también eliminaría felizmente your/directory-that-you-wanted-to-remove-is-definitely-not-t‌​his-one.

Para obtener más información, consulte S3 boto list keys a veces devuelve la clave de directorio.

 36
Author: Antti Haapala,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-17 13:23:19

Siento que ha pasado un tiempo y boto3 tiene algunas formas diferentes de lograr este objetivo. Esto supone que desea eliminar la prueba "carpeta" y todos sus objetos Aquí es una manera:

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)

Esto debe hacer dos peticiones, una para recuperar los objetos en la carpeta, la segunda para eliminar todos los objetos en dicha carpeta.

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

 33
Author: Patrick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-19 22:23:24

Puede usar bucket.delete_keys () con una lista de claves (con un gran número de claves encontré que esto es un orden de magnitud más rápido que usar key.eliminar).

Algo como esto:

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)
 17
Author: David Fooks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-04 14:25:28

Una ligera mejora en la solución de Patrick. Como sabrás, tanto list_objects() como delete_objects() tienen un límite de objetos de 1000. Esta es la razón por la que tienes que paginar listado y eliminar en trozos. Esto es bastante universal y se puede dar Prefix a paginator.paginate() para eliminar subdirectorios/rutas

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)
 12
Author: dmitrybelyakov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-16 11:32:00