ฉันมีโครงสร้างโฟลเดอร์ต่อไปนี้ใน S3 มีวิธีลบไฟล์ทั้งหมดซ้ำ ๆ ในโฟลเดอร์บางโฟลเดอร์หรือไม่ (พูด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/..
ฉันมีโครงสร้างโฟลเดอร์ต่อไปนี้ใน S3 มีวิธีลบไฟล์ทั้งหมดซ้ำ ๆ ในโฟลเดอร์บางโฟลเดอร์หรือไม่ (พูด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/..
คำตอบ:
ด้วยเครื่องมือบรรทัดคำสั่ง aws-cli pythonล่าสุดในการลบไฟล์ทั้งหมดซ้ำ ๆ ภายใต้โฟลเดอร์ในที่เก็บข้อมูลเป็นเพียง:
aws s3 rm --recursive s3://your_bucket_name/foo/
หรือลบทุกอย่างในถัง:
aws s3 rm --recursive s3://your_bucket_name
หากสิ่งที่คุณต้องการคือการลบที่เก็บข้อมูลจริงๆมีทางลัดขั้นตอนเดียว:
aws s3 rb --force s3://your_bucket_name
ซึ่งจะลบเนื้อหาในที่เก็บข้อมูลนั้นแบบวนซ้ำแล้วลบที่เก็บข้อมูล
หมายเหตุ: s3://
จำเป็นต้องใช้คำนำหน้าโปรโตคอลเพื่อให้คำสั่งเหล่านี้ทำงานได้
rm
จะลบไฟล์เท่านั้น แต่rb --force
จะลบไฟล์และที่เก็บข้อมูล
--recursive
ลบโฟลเดอร์ด้วย
สิ่งนี้เคยต้องการการเรียก API เฉพาะต่อคีย์ (ไฟล์) แต่ได้รับการปรับให้ง่ายขึ้นอย่างมากเนื่องจากการเปิดตัวAmazon S3 - Multi-Object Deleteในเดือนธันวาคม 2554:
Multi-Object Delete ใหม่ของ Amazon S3ช่วยให้คุณสามารถลบวัตถุได้มากถึง 1,000 รายการจากที่เก็บข้อมูล S3 ด้วยคำขอเพียงครั้งเดียว
ดูคำตอบของฉันสำหรับคำถามที่เกี่ยวข้องลบออกจาก S3 โดยใช้ api php โดยใช้สัญลักษณ์แทนสำหรับข้อมูลเพิ่มเติมเกี่ยวกับสิ่งนี้และตัวอย่างตามลำดับใน PHP ( AWS SDK สำหรับ PHPรองรับสิ่งนี้ตั้งแต่เวอร์ชัน 1.4.8 )
ไลบรารีไคลเอ็นต์ AWS ส่วนใหญ่ได้แนะนำการสนับสนุนเฉพาะสำหรับฟังก์ชันนี้ไม่ทางใดก็ทางหนึ่งเช่น:
คุณสามารถบรรลุสิ่งนี้ได้ด้วยอินเทอร์เฟซboto Python ที่ยอดเยี่ยมไปยัง AWS โดยประมาณดังต่อไปนี้ (ยังไม่ได้ทดสอบจากด้านบนของหัวของฉัน):
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])
สิ่งนี้พร้อมใช้งานตั้งแต่เวอร์ชัน 1.24ของAWS SDK for Rubyและบันทึกประจำรุ่นให้ตัวอย่างด้วยเช่นกัน:
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!
หรือ:
AWS::S3::Bucket.delete('your_bucket', :force => true)
aws cli
คำตอบใหม่เช่น @ number5 ด้านล่างdocs.aws.amazon.com/cli/latest/reference/s3/rm.html
นอกจากนี้คุณยังอาจพิจารณาใช้ Amazon S3 Lifecycle foo/bar1
เพื่อสร้างหมดอายุสำหรับไฟล์ที่มีคำนำหน้าด้วย
เปิดคอนโซลเบราว์เซอร์ S3 แล้วคลิกที่ฝากข้อมูล จากนั้นคลิก Properties แล้วคลิก LifeCycle
สร้างกฎการหมดอายุสำหรับไฟล์ทั้งหมดด้วยคำนำหน้าfoo/bar1
และตั้งวันที่เป็น 1 วันนับตั้งแต่สร้างไฟล์
บันทึกและไฟล์ที่ตรงกันทั้งหมดจะหายไปภายใน 24 ชั่วโมง
อย่าลืมลบกฎหลังจากทำเสร็จแล้ว!
ไม่มีการเรียก API ไม่มีไลบรารีแอปหรือสคริปต์ของบุคคลที่สาม
ฉันเพิ่งลบไฟล์หลายล้านไฟล์ด้วยวิธีนี้
ภาพหน้าจอที่แสดงหน้าต่างกฎวงจรอายุ (หมายเหตุในภาพนี้คำนำหน้าถูกปล่อยว่างไว้ซึ่งส่งผลต่อคีย์ทั้งหมดในที่เก็บข้อมูล)
ด้วยs3cmd
แพ็คเกจที่ติดตั้งบนเครื่อง Linux คุณสามารถทำได้
s3cmd rm s3://foo/bar --recursive
s3cmd del s3://BUCKET/OBJECT
s3cmd rb s3://BUCKET
ไม่มีอย่างน้อยตามs3cmd rm
s3cmd --help
s3cmd rm
อยู่ในความช่วยเหลือในปี 2019 (เป็นนามแฝงสำหรับเดล) นี่เป็นคำตอบที่ยอดเยี่ยม aws
เครื่องมือ CLI ทำงานเฉพาะกับ/
คำนำหน้ายุติ แต่ไม่โฟลเดอร์และคำนำหน้าชื่อไฟล์บางส่วนในขณะที่ผลงาน s3cmd ในทั้งสองกรณี คำตอบนี้ต้องการการโหวตมากขึ้นฉันต้องเลื่อนไปไกลเกินไปเพื่อหาวิธีแก้ปัญหาที่ถูกต้อง
ในกรณีที่คุณต้องการลบวัตถุทั้งหมดที่มีคำนำหน้า "foo /" โดยใช้ 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<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;
};
ในกรณีที่ใช้ AWS-SKD สำหรับ 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
โปรดทราบ "foo / *" ทั้งหมดที่อยู่ในที่เก็บข้อมูลจะถูกลบ
ฉันเพิ่งลบไฟล์ทั้งหมดออกจากที่เก็บข้อมูลโดยใช้ PowerShell:
Get-S3Object -BucketName YOUR_BUCKET | % { Remove-S3Object -BucketName YOUR_BUCKET -Key $_.Key -Force:$true }
เพิ่งเห็นว่า Amazon เพิ่มตัวเลือก "How to Empty a Bucket" ในเมนูคอนโซล AWS:
http://docs.aws.amazon.com/AmazonS3/latest/UG/DeletingaBucket.html
คำตอบที่โหวตขึ้นไม่มีขั้นตอน
ต่อ aws s3 help:
ปัจจุบันยังไม่มีการสนับสนุนสำหรับการใช้สัญลักษณ์แทนสไตล์ UNIX ในอาร์กิวเมนต์พา ธ ของคำสั่ง อย่างไรก็ตามคำสั่งส่วนใหญ่มี
--exclude "<value>"
และ--include "<value>"
พารามิเตอร์ที่สามารถบรรลุผลลัพธ์ที่ต้องการ ......... เมื่อมีตัวกรองหลายตัวกฎคือตัวกรองที่ปรากฏในภายหลังในคำสั่งจะมีความสำคัญเหนือตัวกรองที่ปรากฏก่อนหน้าในคำสั่ง ตัวอย่างเช่นหากพารามิเตอร์ตัวกรองส่งผ่านไปยังคำสั่งคือ--exclude "*"
--include "*.txt"
ไฟล์ทั้งหมดจะถูกแยกออกจากคำสั่งยกเว้นไฟล์ที่ลงท้ายด้วย. txt
aws s3 rm --recursive s3://bucket/ --exclude="*" --include="/folder_path/*"
วิธีที่ดีที่สุดคือใช้กฎอายุการใช้งานเพื่อลบเนื้อหาที่เก็บข้อมูลทั้งหมด โดยทางโปรแกรมคุณสามารถใช้รหัสต่อไปนี้ (PHP) เพื่อ PUT lifecycle rule
$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',
),
),
));
ในกรณีข้างต้นวัตถุทั้งหมดจะถูกลบโดยเริ่มตั้งแต่วันที่ - "วันนี้ GMT เที่ยงคืน"
คุณยังสามารถระบุวันได้ดังนี้ แต่ด้วยวันจะต้องรออย่างน้อย 24 ชั่วโมง (อย่างน้อย 1 วัน) เพื่อเริ่มลบเนื้อหาที่เก็บข้อมูล
$expiration = array('Days' => 1);
ฉันต้องทำสิ่งต่อไปนี้ ...
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
ในคอนโซลการจัดการ S3 ให้คลิกที่เครื่องหมายถูกสำหรับที่เก็บข้อมูลแล้วคลิกปุ่มว่างจากด้านขวาบน