कैसे एक S3 बाल्टी से पुनरावर्ती फ़ाइलों को हटाने के लिए


87

मेरे पास 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/..

जवाबों:


163

नवीनतम 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
इसका उत्तर होना चाहिए। यह (नया-ईश) मानक, शक्तिशाली उपकरण है, जो इस प्रश्न की तरह चीजों के लिए बनाया गया है
डॉन चेडल

यह फ़ाइलों को केवल ठीक हटा रहा है, लेकिन इसकी भी फ़ाइलों को हटाने के बाद बाल्टी को हटा रहा है। क्या मैं कुछ भूल गया?
नवीन

1
@ नवीन जैसा कि मैंने ऊपर कहा है, rmकेवल फ़ाइलों rb --forceको हटा देगा, लेकिन फ़ाइलों और बाल्टी को हटा देगा ।
नंबर 5

5
--recursiveफ़ोल्डर का उपयोग करने के साथ ही नष्ट कर देता है।
२१:१२

1
@ मोसेली का मानना ​​है कि आपके पास वास्तव में एक s3 बाल्टी में एक खाली फ़ोल्डर नहीं हो सकता है
ryantuck

58

इसके लिए प्रति कुंजी (फाइल) एक समर्पित एपीआई कॉल की आवश्यकता थी, लेकिन दिसंबर 2011 में अमेज़न एस 3 - मल्टी-ऑब्जेक्ट डिलीट की शुरुआत के कारण इसे बहुत सरल बना दिया गया है :

अमेज़ॅन S3 की नई मल्टी-ऑब्जेक्ट डिलीट आपको S3 बाल्टी से 1000 वस्तुओं को एक ही अनुरोध के साथ हटाने की क्षमता देती है।

इस पर और अधिक और इसके लिए PHP में संबंधित उदाहरण (PHP के लिए एडब्ल्यूएस एसडीके संस्करण 1.4.8 से समर्थन करता है ) के लिए वाइल्डकार्ड का उपयोग करते हुए एस 3 से संबंधित प्रश्न हटाएं से मेरा उत्तर देखें ।

अधिकांश AWS ग्राहक पुस्तकालयों ने इस तरह एक या दूसरे तरीके से इस कार्यक्षमता के लिए समर्पित समर्थन पेश किया है, जैसे:

अजगर

आप इसे उत्कृष्ट बोटो पाइथन इंटरफेस के साथ 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 के बाद से उपलब्ध है और रिलीज नोट्स एक उदाहरण भी प्रदान करते हैं:

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)


43

आप उपसर्ग के साथ फ़ाइलों के लिए एक समाप्ति बनाने के लिए अमेज़ॅन एस 3 लाइफसाइकल का उपयोग करने पर भी विचार कर सकते हैं foo/bar1

S3 ब्राउज़र कंसोल खोलें और एक बाल्टी पर क्लिक करें। उसके बाद Properties और फिर LifeCycle पर क्लिक करें।

उपसर्ग के साथ सभी फ़ाइलों के लिए एक समाप्ति नियम बनाएँ foo/bar1 और फ़ाइल बनाने के बाद से तारीख को 1 दिन निर्धारित करें।

सहेजें और सभी मिलान फ़ाइलें 24 घंटों के भीतर चली जाएंगी।

आपके द्वारा किए जाने के बाद नियम को हटाना न भूलें!

कोई API कॉल, कोई तृतीय पक्ष लाइब्रेरी, एप्लिकेशन या स्क्रिप्ट नहीं।

मैंने अभी कई मिलियन फाइलें इस तरह से डिलीट की हैं।

एक स्क्रीनशॉट जो जीवनचक्र नियम खिड़की दिखा रहा है (इस शॉट में प्रीफिक्स को खाली छोड़ दिया गया है, बाल्टी में सभी कुंजियों को प्रभावित करता है):

यहाँ छवि विवरण दर्ज करें


4
कुछ डिलीट कमांड के बजाय लाइफसाइकल का उपयोग करने के लिए बढ़िया विचार।
एक्सिस

वास्तव में, S3 इसे आपके लिए करते हैं।
रयान

आप इसे पूरी बाल्टी पर भी लागू कर सकते हैं, जिससे आप बाल्टी को हटा सकते हैं।
इंडोलरिंग

8

यदि आप जावा एडब्ल्यूएस एसडीके 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
मैं जावा के बारे में इस उत्तर की तुलना में लोगों को क्या पसंद नहीं करता, के बारे में अधिक बताने वाला प्रदर्शन पा सकता हूं ...
जीवण

7

s3cmdलिनक्स मशीन पर स्थापित पैकेज के साथ , आप ऐसा कर सकते हैं

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


1
मदद के अनुसार यह सिंगल-ऑब्जेक्ट डिलीट s3cmd del s3://BUCKET/OBJECTया पूरी बकेट डिलीट है s3cmd rb s3://BUCKET। कोई है s3cmd rmके अनुसार कम से कम, s3cmd --help
पॉल मैकमुर्डी

s3cmd rm2019 की मदद में है (डेल के लिए एक उपनाम के रूप में), यह एक उत्कृष्ट जवाब है। awsCLI उपकरण केवल एक के खिलाफ काम /दोनों ही मामलों में s3cmd काम करता है, जबकि समाप्ति वाला उपसर्ग, लेकिन नहीं एक फ़ोल्डर और आंशिक फ़ाइल नाम उपसर्ग,। इस उत्तर को बहुत अधिक अपवर्जन की आवश्यकता है, मुझे सही समाधान खोजने के लिए बहुत दूर तक स्क्रॉल करना पड़ा।
डेविड पार्क

3

माणिक V2 के लिए AWS-SKD का उपयोग करने के मामले में।

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

कृपया ध्यान दें, बाल्टी के नीचे सभी "फू / *" हट जाएंगे।


2

मैंने अभी PowerShell का उपयोग करके अपनी बाल्टी से सभी फाइलें हटा दी हैं:

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

इस उत्तर को पोस्ट करने के लिए धन्यवाद, मैं इस सटीक काम को करने की कोशिश कर रहा था और उसने "% _। की।" रखा था जो काम नहीं करता है।
स्कॉट गार्टनर


1

मतदान का जवाब एक कदम याद आ रहा है।

प्रति a3 s सहायता

वर्तमान में, कमांड के पथ तर्क में UNIX शैली वाइल्डकार्ड के उपयोग के लिए कोई समर्थन नहीं है। हालाँकि, अधिकांश कमांड्स --exclude "<value>"और --include "<value>" पैरामीटर हैं जो वांछित परिणाम प्राप्त कर सकते हैं ......... जब कई फिल्टर होते हैं, तो नियम फ़िल्टर होते हैं जो बाद में कमांड में दिखाई देते हैं जो पहले कमांड में दिखाई देने वाले फिल्टर पर पूर्वता लेते हैं। उदाहरण के लिए, यदि फ़िल्टर पैरामीटर कमांड को पास किया गया था। --exclude "*" --include "*.txt"सभी फाइलें .txt के साथ समाप्त होने वाली फाइलों को छोड़कर सभी फाइलों को कमांड से बाहर कर दिया जाएगा

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

0

सबसे अच्छा तरीका है कि पूरी बाल्टी सामग्री को हटाने के लिए जीवनचक्र नियम का उपयोग किया जाए। प्रोग्रामिक रूप से आप निम्न कोड (PHP) का उपयोग जीवनचक्र नियम को करने के लिए कर सकते हैं।

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

उपरोक्त मामले में सभी वस्तुओं को शुरू होने की तारीख से हटा दिया जाएगा - "आज जीएमटी आधी रात"।

आप दिन को निम्नानुसार भी निर्दिष्ट कर सकते हैं। लेकिन डेज़ के साथ यह बाल्टी की सामग्री को हटाने के लिए कम से कम 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.