วิธีลบไฟล์ซ้ำจากที่เก็บ S3


90

ฉันมีโครงสร้างโฟลเดอร์ต่อไปนี้ใน 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/..

คำตอบ:


169

ด้วยเครื่องมือบรรทัดคำสั่ง 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://จำเป็นต้องใช้คำนำหน้าโปรโตคอลเพื่อให้คำสั่งเหล่านี้ทำงานได้


2
นี่น่าจะเป็นคำตอบ เป็นเครื่องมือที่ทรงพลังมาตรฐาน (new-ish) ออกแบบมาเพื่อสิ่งต่างๆเช่นเดียวกับคำถามนี้
Don Cheadle

นี่เป็นการลบไฟล์ได้ดี แต่ยังลบที่เก็บข้อมูลหลังจากลบไฟล์ ฉันพลาดอะไรไปหรือเปล่า?
Naveen

1
@Naveen ตามที่ฉันได้กล่าวไว้ข้างต้นrmจะลบไฟล์เท่านั้น แต่rb --forceจะลบไฟล์และที่เก็บข้อมูล
เลขที่

5
โดยใช้--recursiveลบโฟลเดอร์ด้วย
ryantuck

2
@Moseleyi ฉันเชื่อว่าคุณไม่สามารถมีโฟลเดอร์ว่างในถัง s3 ได้จริง
ryantuck

58

สิ่งนี้เคยต้องการการเรียก 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 ส่วนใหญ่ได้แนะนำการสนับสนุนเฉพาะสำหรับฟังก์ชันนี้ไม่ทางใดก็ทางหนึ่งเช่น:

Python

คุณสามารถบรรลุสิ่งนี้ได้ด้วยอินเทอร์เฟซ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
Don Cheadle

43

นอกจากนี้คุณยังอาจพิจารณาใช้ Amazon S3 Lifecycle foo/bar1เพื่อสร้างหมดอายุสำหรับไฟล์ที่มีคำนำหน้าด้วย

เปิดคอนโซลเบราว์เซอร์ S3 แล้วคลิกที่ฝากข้อมูล จากนั้นคลิก Properties แล้วคลิก LifeCycle

สร้างกฎการหมดอายุสำหรับไฟล์ทั้งหมดด้วยคำนำหน้าfoo/bar1และตั้งวันที่เป็น 1 วันนับตั้งแต่สร้างไฟล์

บันทึกและไฟล์ที่ตรงกันทั้งหมดจะหายไปภายใน 24 ชั่วโมง

อย่าลืมลบกฎหลังจากทำเสร็จแล้ว!

ไม่มีการเรียก API ไม่มีไลบรารีแอปหรือสคริปต์ของบุคคลที่สาม

ฉันเพิ่งลบไฟล์หลายล้านไฟล์ด้วยวิธีนี้

ภาพหน้าจอที่แสดงหน้าต่างกฎวงจรอายุ (หมายเหตุในภาพนี้คำนำหน้าถูกปล่อยว่างไว้ซึ่งส่งผลต่อคีย์ทั้งหมดในที่เก็บข้อมูล)

ป้อนคำอธิบายภาพที่นี่


4
ความคิดที่ดีในการใช้ Lifecycle แทนคำสั่งลบ
xis

แน่นอนปล่อยให้ S3 ทำเพื่อคุณ
Ryan

คุณยังสามารถใช้สิ่งนี้กับที่เก็บข้อมูลทั้งหมดทำให้คุณสามารถลบที่เก็บข้อมูลได้
Indolering

8

ด้วยs3cmdแพ็คเกจที่ติดตั้งบนเครื่อง Linux คุณสามารถทำได้

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


1
ตามที่ช่วยเป็นเป็นทั้งเดี่ยววัตถุลบถังหรือทั้งลบs3cmd del s3://BUCKET/OBJECT s3cmd rb s3://BUCKETไม่มีอย่างน้อยตามs3cmd rm s3cmd --help
Paul McMurdie

s3cmd rmอยู่ในความช่วยเหลือในปี 2019 (เป็นนามแฝงสำหรับเดล) นี่เป็นคำตอบที่ยอดเยี่ยม awsเครื่องมือ CLI ทำงานเฉพาะกับ/คำนำหน้ายุติ แต่ไม่โฟลเดอร์และคำนำหน้าชื่อไฟล์บางส่วนในขณะที่ผลงาน s3cmd ในทั้งสองกรณี คำตอบนี้ต้องการการโหวตมากขึ้นฉันต้องเลื่อนไปไกลเกินไปเพื่อหาวิธีแก้ปัญหาที่ถูกต้อง
David Parks

8

ในกรณีที่คุณต้องการลบวัตถุทั้งหมดที่มีคำนำหน้า "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;
};

1
ฉันไม่พบการสาธิตที่บอกเล่าถึงสิ่งที่ผู้คนไม่ชอบเกี่ยวกับ Java มากไปกว่าคำตอบนี้ ...
Jivan

3

ในกรณีที่ใช้ 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 / *" ทั้งหมดที่อยู่ในที่เก็บข้อมูลจะถูกลบ


2

ฉันเพิ่งลบไฟล์ทั้งหมดออกจากที่เก็บข้อมูลโดยใช้ PowerShell:

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

ขอบคุณสำหรับการโพสต์คำตอบนี้ฉันพยายามทำสิ่งนี้ให้ถูกต้องและใส่ -Key "% _. Key" ซึ่งไม่ได้ผล
Scott Gartner


2

คำตอบที่โหวตขึ้นไม่มีขั้นตอน

ต่อ aws s3 help:

ปัจจุบันยังไม่มีการสนับสนุนสำหรับการใช้สัญลักษณ์แทนสไตล์ UNIX ในอาร์กิวเมนต์พา ธ ของคำสั่ง อย่างไรก็ตามคำสั่งส่วนใหญ่มี --exclude "<value>"และ--include "<value>" พารามิเตอร์ที่สามารถบรรลุผลลัพธ์ที่ต้องการ ......... เมื่อมีตัวกรองหลายตัวกฎคือตัวกรองที่ปรากฏในภายหลังในคำสั่งจะมีความสำคัญเหนือตัวกรองที่ปรากฏก่อนหน้าในคำสั่ง ตัวอย่างเช่นหากพารามิเตอร์ตัวกรองส่งผ่านไปยังคำสั่งคือ--exclude "*" --include "*.txt"ไฟล์ทั้งหมดจะถูกแยกออกจากคำสั่งยกเว้นไฟล์ที่ลงท้ายด้วย. txt

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

0

วิธีที่ดีที่สุดคือใช้กฎอายุการใช้งานเพื่อลบเนื้อหาที่เก็บข้อมูลทั้งหมด โดยทางโปรแกรมคุณสามารถใช้รหัสต่อไปนี้ (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);

0

ฉันต้องทำสิ่งต่อไปนี้ ...

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

ในคอนโซลการจัดการ S3 ให้คลิกที่เครื่องหมายถูกสำหรับที่เก็บข้อมูลแล้วคลิกปุ่มว่างจากด้านขวาบน


สวัสดีและยินดีต้อนรับสู่ SO! โปรดอ่านทัวร์และฉันจะเขียนคำตอบที่ดีได้อย่างไร? ตัวอย่างเช่นภาพหน้าจอจะเป็นประโยชน์
Tomer Shetah
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.