Amazon S3 boto - comment supprimer un dossier?

j'ai créé un dossier dans s3, nommé" test "et j'appuie sur "test_1".jpg", " test_2.jpg "dans " test".

Maintenant je veux utiliser boto pour supprimer le dossier "test".

Que dois-je faire?

31
demandé sur wade huang 2012-07-11 10:10:53

4 réponses

il y a Non dossiers dans S3. Au lieu de cela, les clés forment un espace de nom plat. Cependant une clé avec des slashs dans son nom apparaît spécialement dans certains programmes, y compris la console AWS (voir par exemple Amazon S3 boto - comment créer un dossier? ).

au lieu de supprimer" un répertoire", vous pouvez (et devez) lister les fichiers par préfixe et supprimer. En substance:

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

cependant l'autre accompli les réponses sur cette page présentent des approches plus efficaces.


notez que le préfixe est simplement recherché en utilisant la recherche de ficelles. Si le préfixe était your/directory , c'est-à-dire, sans la barre oblique de fin en annexe, le programme supprimerait aussi volontiers your/directory-that-you-wanted-to-remove-is-definitely-not-t‌​his-one .

pour plus d'informations, voir S3 les clés de la liste boto renvoient parfois la clé du répertoire.

36
répondu Antti Haapala 2018-01-17 13:23:19

je pense que ça fait longtemps et boto3 a quelques façons différentes d'atteindre cet objectif. Cela suppose que vous voulez supprimer le test "dossier" et tous ses objets en Voici une:

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)

cela devrait faire deux requêtes, l'une pour récupérer les objets dans le dossier, la seconde pour supprimer tous les objets dans ledit dossier.

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

33
répondu Patrick 2016-01-19 22:23:24

Vous pouvez utiliser seau.delete_keys() avec une liste de clés (avec un grand nombre de touches, j'ai trouvé ceci pour être un ordre de grandeur plus rapide que l'utilisation de la clé.supprimer.)

quelque chose comme ça:

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
répondu David Fooks 2013-07-04 14:25:28

une légère amélioration sur la solution de Patrick. Comme vous le savez peut-être, les deux list_objects() et delete_objects() ont une limite d'objet de 1000. C'est pourquoi vous devez paginer la liste et supprimer en morceaux. C'est assez universel et vous pouvez donner Prefix à paginator.paginate() pour supprimer les sous-répertoires /chemins

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
répondu dmitrybelyakov 2017-04-16 11:32:00