Comment supprimer des fichiers récursivement à partir d’un compartiment S3

J’ai la structure de dossiers suivante dans S3. Existe-t-il un moyen de supprimer tous les fichiers de manière récursive dans un certain dossier (par exemple, foo/bar1 or foo or foo/bar2/1 ..)

 foo/bar1/1/.. foo/bar1/2/.. foo/bar1/3/.. foo/bar2/1/.. foo/bar2/2/.. foo/bar2/3/.. 

Avec les derniers outils de ligne de commande aws-cli python , pour supprimer récursivement tous les fichiers d’un dossier dans un compartiment, il suffit de:

 aws s3 rm --recursive s3://your_bucket_name/foo/ 

Ou supprimer tout sous le seau:

 aws s3 rm --recursive s3://your_bucket_name 

Si vous voulez réellement supprimer le compartiment, il existe un raccourci en une étape:

 aws s3 rb --force s3://your_bucket_name 

qui supprimera le contenu de ce compartiment de manière récursive, puis supprimera le compartiment.

Remarque: le préfixe de protocole s3:// est requirejs pour que ces commandes fonctionnent

Cela nécessitait un appel d’API dédié par clé (fichier), mais a été grandement simplifié grâce à l’introduction d’ Amazon S3 – Suppression d’objects multiples en décembre 2011:

La nouvelle suppression multi-objects d’ Amazon S3 vous permet de supprimer jusqu’à 1 000 objects d’un compartiment S3 avec une seule requête.

Voir ma réponse à la question connexe effacer de S3 en utilisant api php en utilisant des caractères génériques pour plus d’informations à ce sujet et des exemples respectifs en PHP (le kit AWS SDK pour PHP le supporte depuis la version 1.4.8 ).

La plupart des bibliothèques client AWS ont entre-temps introduit un support dédié à cette fonctionnalité d’une manière ou d’une autre, par exemple:

Python

Vous pouvez y parvenir avec l’excellente interface boto Python vers AWS, en gros comme suit (non testé du haut de ma tête):

 import boto s3 = boto.connect_s3() bucket = s3.get_bucket("bucketname") bucketListResultSet = bucket.list(prefix="foo/bar") result = bucket.delete_keys([key.name for key in bucketListResultSet]) 

Rubis

Ceci est disponible depuis la version 1.24 du kit AWS SDK pour Ruby et les notes de version en fournissent également un exemple:

 bucket = AWS::S3.new.buckets['mybucket'] # delete a list of objects by keys, objects are deleted in batches of 1k per # request. Accepts ssortingngs, AWS::S3::S3Object, AWS::S3::ObectVersion and # hashes with :key and :version_id bucket.objects.delete('key1', 'key2', 'key3', ...) # delete all of the objects in a bucket (optionally with a common prefix as shown) bucket.objects.with_prefix('2009/').delete_all # conditional delete, loads and deletes objects in batches of 1k, only # deleting those that return true from the block bucket.objects.delete_if{|object| object.key =~ /\.pdf$/ } # empty the bucket and then delete the bucket, objects are deleted in batches of 1k bucket.delete! 

Ou:

 AWS::S3::Bucket.delete('your_bucket', :force => true) 

Vous pouvez également envisager d’utiliser Amazon S3 Lifecycle pour créer une expiration pour les fichiers avec le préfixe foo/bar1 .

Ouvrez la console du navigateur S3 et cliquez sur un compartiment. Cliquez ensuite sur Propriétés, puis sur LifeCycle.

Créez une règle d’expiration pour tous les fichiers avec le préfixe foo/bar1 et définissez la date sur 1 jour depuis la création du fichier.

Enregistrer et tous les fichiers correspondants disparaîtront dans les 24 heures.

N’oubliez pas de supprimer la règle une fois que vous avez terminé!

Aucun appel d’API, aucune bibliothèque, application ou script tiers.

Je viens de supprimer plusieurs millions de fichiers de cette façon.

Une capture d’écran montrant la fenêtre de la règle de cycle de vie (notez que le préfixe a été laissé vide dans toutes les clés du compartiment):

entrer la description de l'image ici

Je viens de supprimer tous les fichiers de mon compartiment en utilisant PowerShell:

 Get-S3Object -BucketName YOUR_BUCKET | % { Remove-S3Object -BucketName YOUR_BUCKET -Key $_.Key -Force:$true } 

Avec le paquet s3cmd installé sur une machine Linux, vous pouvez le faire

s3cmd rm s3://foo/bar --recursive

En cas d’utilisation d’AWS-SKD pour ruby ​​V2.

 s3.list_objects(bucket: bucket_name, prefix: "foo/").contents.each do |obj| next if obj.key == "foo/" resp = s3.delete_object({ bucket: bucket_name, key: obj.key, }) end 

attention s’il vous plaît, tout “foo / *” sous seau va supprimer.

Je viens de voir que Amazon a ajouté une option “Comment vider un seau” dans le menu de la console AWS:

http://docs.aws.amazon.com/AmazonS3/latest/UG/DeletingaBucket.html

Le meilleur moyen est d’utiliser la règle du cycle de vie pour supprimer tout le contenu du compartiment. Par programme, vous pouvez utiliser le code suivant (PHP) pour appliquer la règle de cycle de vie PUT.

 $expiration = array('Date' => date('U', strtotime('GMT midnight'))); $result = $s3->putBucketLifecycle(array( 'Bucket' => 'bucket-name', 'Rules' => array( array( 'Expiration' => $expiration, 'ID' => 'rule-name', 'Prefix' => '', 'Status' => 'Enabled', ), ), )); 

Dans ce cas, tous les objects seront supprimés à partir de la date – “Aujourd’hui GMT minuit”.

Vous pouvez également spécifier les jours comme suit. Mais avec Days il faudra attendre au moins 24 heures (1 jour minimum) pour commencer à supprimer le contenu du compartiment.

 $expiration = array('Days' => 1); 

Je devais faire ce qui suit …

 def delete_bucket s3 = init_amazon_s3 s3.buckets['BUCKET-NAME'].objects.each do |obj| obj.delete end end def init_amazon_s3 config = YAML.load_file("#{Rails.root}/config/s3.yml") AWS.config(:access_key_id => config['access_key_id'],:secret_access_key => config['secret_access_key']) s3 = AWS::S3.new end 

Si vous souhaitez supprimer tous les objects avec le préfixe “foo /” à l’aide de Java AWS SDK 2.0

 import java.util.ArrayList; import java.util.Iterator; import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.services.s3.model.*; //... ListObjectsRequest listObjectsRequest = ListObjectsRequest.builder() .bucket(bucketName) .prefix("foo/") .build() ; ListObjectsResponse objectsResponse = s3Client.listObjects(listObjectsRequest); while (true) { ArrayList objects = new ArrayList<>(); for (Iterator iterator = objectsResponse.contents().iterator(); iterator.hasNext(); ) { S3Object s3Object = (S3Object)iterator.next(); objects.add( ObjectIdentifier.builder() .key(s3Object.key()) .build() ); } s3Client.deleteObjects( DeleteObjectsRequest.builder() .bucket(bucketName) .delete( Delete.builder() .objects(objects) .build() ) .build() ); if (objectsResponse.isTruncated()) { objectsResponse = s3Client.listObjects(listObjectsRequest); continue; } break; };