it-swarm.com.de

So löschen Sie Dateien rekursiv aus einem S3-Bucket

Ich habe die folgende Ordnerstruktur in S3. Gibt es eine Möglichkeit, alle Dateien in einem bestimmten Ordner rekursiv zu entfernen (sagen Sie 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/..
54
priya

Mit den neuesten aws-cli Python-Befehlszeilentools ist das rekursive Löschen aller Dateien in einem Ordner in einem Bucket nur

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

Oder löschen Sie alles unter dem Eimer:

aws s3 rm --recursive s3://your_bucket_name

Wenn Sie den Bucket tatsächlich löschen möchten, gibt es eine einstufige Verknüpfung:

aws s3 rb --force s3://your_bucket_name

dadurch wird der Inhalt in diesem Bucket rekursiv entfernt und anschließend der Bucket gelöscht.

Hinweis: Damit diese Befehle funktionieren, ist das Präfix s3:// erforderlich

105
number5

Dies erforderte früher einen dedizierten API-Aufruf pro Schlüssel (Datei), wurde jedoch durch die Einführung von Amazon S3 - Multi-Object Delete im Dezember 2011 erheblich vereinfacht:

Amazon S3's Mit dem neuen Multi-Object Delete können Sie mit einer einzigen Anfrage bis zu 1000 Objekte aus einem S3-Bucket löschen.

Siehe meine Antwort auf die zugehörige Frage Löschen aus S3 mit API PHP mit Platzhalterzeichen für weitere Informationen zu diesem und den entsprechenden Beispielen in PHP (das AWS SDK für PHP unterstützt dies seit version 1.4.8 ).

Die meisten AWS-Client-Bibliotheken haben inzwischen eine spezielle Unterstützung für diese Funktionalität eingeführt, z.

Python

Sie können dies mit der hervorragenden boto Python -Schnittstelle zu AWS ungefähr wie folgt erreichen (ungetestet, von oben betrachtet):

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])

Ruby

Dies ist verfügbar seit Version 1.24 des AWS SDK for Ruby und die Versionshinweise enthalten auch ein Beispiel:

bucket = AWS::S3.new.buckets['mybucket']

# delete a list of objects by keys, objects are deleted in batches of 1k per
# request.  Accepts strings, 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!

Oder:

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

Sie können auch Amazon S3 Lifecycle verwenden, um einen Ablauf für Dateien mit dem Präfix foo/bar1 zu erstellen.

Öffnen Sie die S3-Browserkonsole und klicken Sie auf einen Bucket. Klicken Sie dann auf Eigenschaften und dann auf Lebenszyklus.

Erstellen Sie eine Ablaufregel für alle Dateien mit dem Präfix foo/bar1 und setzen Sie das Datum auf 1 Tag seit Erstellung der Datei.

Speichern und alle dazugehörigen Dateien werden innerhalb von 24 Stunden gelöscht.

Vergiss nicht, die Regel zu entfernen, wenn du fertig bist!

Keine API-Aufrufe, keine Bibliotheken, Apps oder Skripte von Drittanbietern.

Ich habe gerade mehrere Millionen Dateien auf diese Weise gelöscht.

Ein Screenshot, der das Lifecycle Rule-Fenster zeigt (Hinweis: In diesem Bild wurde das Präfix leer gelassen und betrifft alle Tasten im Bucket):

enter image description here

39
Ryan

Wenn Sie alle Objekte mit dem Präfix "foo /" mit Java AWS SDK 2.0 entfernen möchten

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<ObjectIdentifier> 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;
};
2
abguy

Wenn das s3cmd-Paket auf einem Linux-Computer installiert ist, können Sie dies tun

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

2
MichaelZ

Ich habe mit PowerShell alle Dateien aus meinem Bucket entfernt:

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

Ich habe gerade gesehen, dass Amazon dem AWS-Konsolenmenü die Option "So leeren Sie einen Bucket" hinzugefügt haben:

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

1
JamesKn

Falls Sie AWS-SDK für Ruby V2 verwenden.

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

achtung, alle "foo/*" unter Bucket werden gelöscht.

1
Hajime

Ich musste folgendes tun ...

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
0
Imdad

Der abgewählten Antwort fehlt ein Schritt. Hinweis: Durch Stapelüberlauf werden Sternchen analysiert, sodass in den folgenden Beispielen der Text "Stern" als Platzhalter verwendet wird. Vielen Dank!

Per aws s3 help:

Blockquote Derzeit wird die Verwendung von Platzhaltern im UNIX-Stil in einem .__ nicht unterstützt. Befehlsargumente des Befehls. Die meisten Befehle haben jedoch --exclude "" und --include "" Parameter, die das .__ erreichen können. gewünschtes Ergebnis ......... Wenn es mehrere .__ gibt. Filter ist die Regel die Filter, die später im Befehl take .__ angezeigt werden. Vorrang vor Filtern, die zuvor im Befehl angezeigt wurden. Wenn zum Beispiel die an den Befehl übergebenen Filterparameter --exclude "star" --include "star.txt" waren, werden alle Dateien mit Ausnahme der Endung. mit .txt

aws s3 rm --recursive s3://bucket/ --exclude="star" --include="/folder_path/star" 

Beachten Sie, dass hinter dem Ordnerpfad ein STAR stehen muss

0
einarc

Am besten verwenden Sie eine Lebenszyklusregel, um den gesamten Bucket-Inhalt zu löschen. Programmgesteuert können Sie folgenden Code (PHP) für die PUT-Lebenszyklusregel verwenden.

$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',
                ),
            ),
        ));

In diesem Fall werden alle Objekte ab dem Datum "Heute Mitternacht" gelöscht. 

Sie können Tage auch wie folgt angeben. Bei Days dauert es jedoch mindestens 24 Stunden (mindestens 1 Tag), bis der Inhalt des Eimers gelöscht wird.

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