मैंने "परीक्षण" नाम के s3 में एक फ़ोल्डर बनाया और मैंने "test_1.jpg", "test_2.jpg" को "परीक्षण" में धकेल दिया।
मैं फ़ोल्डर "परीक्षण" को हटाने के लिए बोटो का उपयोग कैसे कर सकता हूं?
जवाबों:
S3 में कोई फ़ोल्डर नहीं हैं । इसके बजाय, चाबियाँ एक फ्लैट नाम स्थान बनाती हैं। हालांकि, इसके नाम में स्लैश के साथ एक कुंजी विशेष रूप से कुछ कार्यक्रमों में दिखाई देती है, जिसमें एडब्ल्यूएस कंसोल (उदाहरण के लिए अमेज़ॅन एस 3 बोटो - एक फ़ोल्डर कैसे बनाएं? ) देखें।
"एक निर्देशिका" को हटाने के बजाय, आप उपसर्ग और हटाकर फ़ाइलों को सूचीबद्ध कर सकते हैं (और कर सकते हैं)। संक्षेप में:
for key in bucket.list(prefix='your/directory/'):
key.delete()
हालाँकि इस पृष्ठ पर अन्य निपुण उत्तरों में अधिक कुशल दृष्टिकोण हैं।
ध्यान दें कि उपसर्ग केवल डमी स्ट्रिंग खोज का उपयोग करके खोजा गया है। यदि उपसर्ग था , अर्थात्, अनुगामी स्लैश संलग्न किए बिना, कार्यक्रम भी खुशी से हटा देगा your/directory
your/directory-that-you-wanted-to-remove-is-definitely-not-this-one
।
अधिक जानकारी के लिए, S3 बोटो सूची कुंजी कभी-कभी निर्देशिका कुंजी लौटाती है।
यहां 2018 (लगभग 2019) संस्करण है:
s3 = boto3.resource('s3')
bucket = s3.Bucket('mybucket')
bucket.objects.filter(Prefix="myprefix/").delete()
मुझे लगता है कि यह एक समय हो गया है और 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
list_objects
आप 1000 से अधिक कुंजी वापस नहीं कर सकते हैं, इसलिए आपको कई बार इस कोड को चलाने की आवश्यकता है।
boto3
, बोटो नहीं
import boto3; def lambda_handler(event, context): '''Code from above'''
। सुनिश्चित करें कि आप अपने लैम्ब्डा को S3 से हटाने की अनुमति देते हैं और टाइमआउट का विस्तार करते हैं।
आप बकेट का उपयोग कर सकते हैं ।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)
पैट्रिक के समाधान पर एक मामूली सुधार। आप जानते होंगे, दोनों 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)
Prefix
को paginator.paginate()
देखें: boto3.readthedocs.io/en/latest/reference/services/…
Prefix
द्वारा सुझाए गए फिल्टर के साथ , मुझे हटाने से पहले एक चेक जोड़ना था (क्योंकि मेरे कुछ S3 उपसर्ग मौजूद नहीं थे / कोई वस्तु नहीं थी)if item is not None