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?
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 , es decir, sin la barra final anexada, el programa también eliminaría felizmente your/directory
your/directory-that-you-wanted-to-remove-is-definitely-not-this-one
.
Para obtener más información, consulte S3 boto list keys a veces devuelve la clave de directorio.
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
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)
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)
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