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/..
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
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.
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])
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)
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):
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;
};
Wenn das s3cmd
-Paket auf einem Linux-Computer installiert ist, können Sie dies tun
s3cmd rm s3://foo/bar --recursive
Ich habe mit PowerShell alle Dateien aus meinem Bucket entfernt:
Get-S3Object -BucketName YOUR_BUCKET | % { Remove-S3Object -BucketName YOUR_BUCKET -Key $_.Key -Force:$true }
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
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.
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
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
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);