Amazon S3 boto - फ़ोल्डर को कैसे हटाएं?


87

मैंने "परीक्षण" नाम के s3 में एक फ़ोल्डर बनाया और मैंने "test_1.jpg", "test_2.jpg" को "परीक्षण" में धकेल दिया।

मैं फ़ोल्डर "परीक्षण" को हटाने के लिए बोटो का उपयोग कैसे कर सकता हूं?


1
@pyCthon गलत तकनीक। पुनः प्रयास करें।
डेविनबॉस्ट

जवाबों:


61

S3 में कोई फ़ोल्डर नहीं हैं । इसके बजाय, चाबियाँ एक फ्लैट नाम स्थान बनाती हैं। हालांकि, इसके नाम में स्लैश के साथ एक कुंजी विशेष रूप से कुछ कार्यक्रमों में दिखाई देती है, जिसमें एडब्ल्यूएस कंसोल (उदाहरण के लिए अमेज़ॅन एस 3 बोटो - एक फ़ोल्डर कैसे बनाएं? ) देखें।

"एक निर्देशिका" को हटाने के बजाय, आप उपसर्ग और हटाकर फ़ाइलों को सूचीबद्ध कर सकते हैं (और कर सकते हैं)। संक्षेप में:

for key in bucket.list(prefix='your/directory/'):
    key.delete()

हालाँकि इस पृष्ठ पर अन्य निपुण उत्तरों में अधिक कुशल दृष्टिकोण हैं।


ध्यान दें कि उपसर्ग केवल डमी स्ट्रिंग खोज का उपयोग करके खोजा गया है। यदि उपसर्ग था your/directory, अर्थात्, अनुगामी स्लैश संलग्न किए बिना, कार्यक्रम भी खुशी से हटा देगा your/directory-that-you-wanted-to-remove-is-definitely-not-t‌​his-one

अधिक जानकारी के लिए, S3 बोटो सूची कुंजी कभी-कभी निर्देशिका कुंजी लौटाती है।


1
निर्देशिका को हटाने के लिए कैसे? यदि यह निर्देशिका स्वचालित रूप से हटा दी जाएगी जब इस निर्देशिका की सभी फाइलें हटा दी जाती हैं?
वेड हुआंग

धन्यवाद आप .. मैं समाप्त कर दिया है यह ~
हुआंग बढ़ना

@wadehuang - क्या आप फ़ोल्डर हटाने के बारे में अपना कोड साझा कर सकते हैं?
21

अजगर के फाइल को कैसे डिलीट करें जो कि अजगर में 2 दिन पुराना हो। यह मेरे s3 में है - बाल्टी / 1 / बैकअप / (10 फाइलें) उन सभी फाइलों को हटाने की जरूरत है जो दो दिन पुरानी हैं
艾瑪艾瑪 艾瑪艾瑪

187

यहां 2018 (लगभग 2019) संस्करण है:

s3 = boto3.resource('s3')
bucket = s3.Bucket('mybucket')
bucket.objects.filter(Prefix="myprefix/").delete()

22
यह अब तक का सबसे अच्छा जवाब है।
user554481

1
किसी को यह जानने के लिए उपयोगी हो सकता है कि bucket.objects.all ()। delete () पूरी बाल्टी को बिना हटाए खाली कर देता है, फिर चाहे कितनी भी वस्तुएं हों (अर्थात यह प्रभावित नहीं होती है लेकिन 1000 आइटम सीमाएँ हैं)। देखें: boto3.amazonaws.com/v1/documentation/api/latest/reference/…
fabiog

1
हाय राज यह मेरे लिए काम नहीं कर रहा है, मैं बस खाली वर्ग कोष्ठक, यानी []
सोया

अफसोस की बात यह है कि यह प्रत्यय का समर्थन नहीं करता है :(
अनाम शेराज़

बड़ी बात यह है कि यह समाधान 1000 से अधिक वस्तुओं के साथ भी काम करता है
मबिन

45

मुझे लगता है कि यह एक समय हो गया है और boto3 के पास इस लक्ष्य को पूरा करने के कुछ अलग तरीके हैं। यह मानता है कि आप परीक्षण "फ़ोल्डर" और उसकी सभी वस्तुओं को हटाना चाहते हैं यहां एक तरीका है:

s3 = boto3.resource('s3')
objects_to_delete = s3.meta.client.list_objects(Bucket="MyBucket", Prefix="myfolder/test/")

delete_keys = {'Objects' : []}
delete_keys['Objects'] = [{'Key' : k} for k in [obj['Key'] for obj in objects_to_delete.get('Contents', [])]]

s3.meta.client.delete_objects(Bucket="MyBucket", Delete=delete_keys)

यह दो अनुरोध करने चाहिए, एक फ़ोल्डर में ऑब्जेक्ट लाने के लिए, दूसरा उक्त फ़ोल्डर में सभी ऑब्जेक्ट को हटाने के लिए।

https://boto3.readthedocs.org/en/latest/reference/services/s3.html#S3.Client.delete_objects


यह अब तक का सबसे तेज समाधान है।
गहरीकरण

2
यह सबसे तेज़ समाधान है, लेकिन ध्यान रखें कि list_objectsआप 1000 से अधिक कुंजी वापस नहीं कर सकते हैं, इसलिए आपको कई बार इस कोड को चलाने की आवश्यकता है।
लैंपस्लेव

4
यदि आप 1k से अधिक ऑब्जेक्ट हैं तो आप पेजिनेटर का उपयोग कर सकते हैं - नीचे मेरा उत्तर देखें।
dmitrybelyakov

@ डीपेलमेंट, और यह केवल काम करता है boto3, बोटो नहीं
एवोकैडो

1
यह अच्छा काम करता है, और आप एक lambda_handler समारोह में उपरोक्त कोड डालकर एक अजगर लैम्ब्डा से चला सकते हैं: import boto3; def lambda_handler(event, context): '''Code from above'''। सुनिश्चित करें कि आप अपने लैम्ब्डा को S3 से हटाने की अनुमति देते हैं और टाइमआउट का विस्तार करते हैं।
नादिर सिदी

21

आप बकेट का उपयोग कर सकते हैं ।delete_keys () कुंजियों की एक सूची के साथ (कुंजी की एक बड़ी संख्या के साथ मैंने पाया कि यह कुंजी का उपयोग करने की तुलना में तेजी से परिमाण का एक क्रम है)।

कुछ इस तरह:

delete_key_list = []
for key in bucket.list(prefix='/your/directory/'):
    delete_key_list.append(key)
    if len(delete_key_list) > 100:
        bucket.delete_keys(delete_key_list)
        delete_key_list = []

if len(delete_key_list) > 0:
    bucket.delete_keys(delete_key_list)

20

पैट्रिक के समाधान पर एक मामूली सुधार। आप जानते होंगे, दोनों list_objects()और delete_objects()1000 की एक वस्तु की सीमा है यही कारण है कि आप लिस्टिंग पृष्ठ पर अंक लगाना और मात्रा में नष्ट करने के लिए किया है। यह सुंदर सार्वभौमिक है और आप दे सकते हैं Prefixकरने के लिए paginator.paginate()नष्ट उपनिर्देशिका / पथ

client = boto3.client('s3', **credentials)
paginator = client.get_paginator('list_objects_v2')
pages = paginator.paginate(Bucket=self.bucket_name)

delete_us = dict(Objects=[])
for item in pages.search('Contents'):
    delete_us['Objects'].append(dict(Key=item['Key']))

    # flush once aws limit reached
    if len(delete_us['Objects']) >= 1000:
        client.delete_objects(Bucket=bucket, Delete=delete_us)
        delete_us = dict(Objects=[])

# flush rest
if len(delete_us['Objects']):
    client.delete_objects(Bucket=bucket, Delete=delete_us)

2
और यदि आप "निर्देशिका" तक सीमित रखना चाहते हैं, तो सभी विकल्पों Prefixको paginator.paginate()देखें: boto3.readthedocs.io/en/latest/reference/services/…
चाड

1
@ChadPrefix द्वारा सुझाए गए फिल्टर के साथ , मुझे हटाने से पहले एक चेक जोड़ना था (क्योंकि मेरे कुछ S3 उपसर्ग मौजूद नहीं थे / कोई वस्तु नहीं थी)if item is not None
y2k-shubham

1

यदि संस्करण S3 बाल्टी पर सक्षम है:

s3 = boto3.resource('s3')
bucket = s3.Bucket('mybucket')
bucket.object_versions.filter(Prefix="myprefix/").delete()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.