Amazon S3 boto – ¿Cómo eliminar una carpeta?

He creado una carpeta en s3, llamada “prueba” y presiono “prueba_1.jpg”, “prueba_2.jpg” en “prueba”.

Ahora quiero usar boto para borrar la carpeta “test”.

¿Qué tengo que hacer?

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

En lugar de eliminar “un directorio”, puede (y debe) listar los archivos por prefijo y eliminar. En esencia:

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

Sin embargo, las otras respuestas realizadas en esta página presentan enfoques más eficientes.


Observe que el prefijo solo se busca mediante la búsqueda de cadenas ficticias. Si el prefijo fuera your/directory , es decir, sin la barra diagonal agregada, el progtwig también eliminará felizmente your/directory-that-you-wanted-to-remove-is-definitely-not-t‌​his-one .

Para obtener más información, consulte S3 Las claves de la lista de boto a veces devuelven la clave del directorio.

Siento que ha pasado un tiempo y boto3 tiene algunas formas diferentes de lograr este objective. Esto supone que desea eliminar la “carpeta” de prueba y todos sus objetos. Aquí hay 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 realizar dos solicitudes, una para recuperar los objetos en la carpeta y la segunda para eliminar todos los objetos en dicha carpeta.

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

Aquí está la versión 2018 (casi 2019):

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

Puede usar bucket.delete_keys () con una lista de teclas (con una gran cantidad de teclas, me parece que este es un orden de magnitud más rápido que usar key.delete).

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) 

Una ligera mejora en la solución de Patrick. Como sabrá, tanto list_objects() como delete_objects() tienen un límite de objetos de 1000. Esta es la razón por la que tiene que paginar la lista y eliminar en trozos. Esto es bastante universal y 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) 

puede hacerlo usando aws cli: https://aws.amazon.com/cli/ y algunos comandos de Unix.

estos comandos aws cli deberían funcionar:

 aws s3 rm  --recursive --exclude "*" --include "" 

Si desea incluir subcarpetas, debe agregar la marca –recursive

o con comandos de unix:

 aws s3 ls s3:/// | awk '{print $4}' | xargs -I%  -c 'aws s3 rm s3://  /% $1' 

explicación:

  1. listar todos los archivos en el cubo –pipe ->
  2. obtenga el 4to parámetro (es el nombre del archivo) –pipe -> // puede reemplazarlo con el comando linux para que coincida con su patrón
  3. ejecutar eliminar script con aws cli