কীভাবে একটি এস 3 বালতি থেকে পুনরাবৃত্তভাবে ফাইলগুলি মুছবেন


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 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://এই কমান্ডগুলি কাজ করার জন্য প্রোটোকল উপসর্গ প্রয়োজন


4
এই উত্তর হওয়া উচিত। এটি একটি (নতুন-ইশ) স্ট্যান্ডার্ড, শক্তিশালী সরঞ্জাম, ঠিক এই প্রশ্নের মতো জিনিসের জন্য ডিজাইন করা হয়েছে
ডন চেইডল

এটি কেবল ফাইলগুলি মুছে ফেলছে তবে এটি ফাইল মুছে ফেলার পরে বালতি মুছে ফেলছে। আমি কিছু মিস করেছি?
নবীন

4
@ নবীন যেমনটি আমি আগেই বলেছি, rmকেবল ফাইলগুলি rb --forceমুছবে তবে ফাইল এবং বালতি মুছে ফেলবে ।
সংখ্যা

4
--recursiveফোল্ডারটি পাশাপাশি মুছে ফেলা ব্যবহার করে ।
ryantuck

4
@ মোসলেই আমি বিশ্বাস করি যে আপনি আসলে একটি এস 3 বালতিতে খালি ফোল্ডার রাখতে পারবেন না
রায়টাক

58

এটিতে কী (ফাইল) প্রতি ডেডিকেটেড এপিআই কল প্রয়োজন হত, তবে অ্যামাজন এস 3 - ডিসেম্বর ২০১১ এ মাল্টি-অবজেক্ট মোছার কারণে এটি ব্যাপকভাবে সরলীকৃত হয়েছে :

অ্যামাজন এস 3 এর নতুন মাল্টি-অবজেক্ট মোছা আপনাকে একক অনুরোধে একটি এস 3 বালতি থেকে 1000 অবধি অবধি মুছতে সক্ষম করে gives

পিএইচপি এবং এ সম্পর্কিত সম্পর্কিত উদাহরণগুলির জন্য আরও ওয়াইল্ডকার্ড ব্যবহার করে এপিআই পিএইচপি ব্যবহার করে এস3 থেকে সম্পর্কিত প্রশ্নের আমার উত্তরটি দেখুন এবং পিএইচপি সম্পর্কিত অ্যাডাব্লুএস এসডিকে এটিকে 1.4.8 সংস্করণ থেকে সমর্থন করে )।

বেশিরভাগ এডাব্লুএস ক্লায়েন্ট লাইব্রেরিগুলি ইতিমধ্যে এই কার্যকারিতাটির জন্য একভাবে বা অন্য কোনওভাবে উত্সর্গীকৃত সমর্থন চালু করেছে, যেমন:

পাইথন

আপনি মোটামুটি নিম্নরূপে এডাব্লুএস-এর কাছে দুর্দান্ত বোটো পাইথন ইন্টারফেসের মাধ্যমে এটি অর্জন করতে পারেন (অনির্ধারিত, আমার মাথার উপরে থেকে):

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 এর এবং রিলিজ নোট হিসাবে ভাল একটি উদাহরণ প্রদান:

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ডকস.আও.এস.মাজোন.এল.সি.লি / স্লেস্ট / রেফারেন্স / এস
ডন

43

আপনি উপসর্গ সহ ফাইলগুলির একটি মেয়াদোত্তীর্ণ তৈরি করতে অ্যামাজন এস 3 লাইফাইসাইকেলটি ব্যবহার করার বিষয়টিও বিবেচনা করতে পারেন foo/bar1

এস 3 ব্রাউজার কনসোলটি খুলুন এবং একটি বালতি ক্লিক করুন। তারপরে প্রোপার্টি এবং তারপরে লাইফ সাইকেল ক্লিক করুন।

উপসর্গ সহ সমস্ত ফাইলের জন্য একটি মেয়াদোত্তীর্ণ নিয়ম তৈরি করুন foo/bar1এবং ফাইলটি তৈরি হওয়ার পর থেকে তারিখটি 1 দিন নির্ধারণ করুন।

সংরক্ষণ করুন এবং সমস্ত মিলে যাওয়া ফাইলগুলি 24 ঘন্টার মধ্যে চলে যাবে।

আপনার কাজ শেষ হওয়ার পরে নিয়মটি সরাতে ভুলবেন না!

কোনও এপিআই কল, তৃতীয় পক্ষের লাইব্রেরি, অ্যাপ্লিকেশন বা স্ক্রিপ্ট নেই।

আমি এইভাবে কয়েক মিলিয়ন ফাইল মুছে ফেলেছি।

লাইফাইসাইকেল রুল উইন্ডোটি দেখানো একটি স্ক্রিনশট (এই শটে নোটটি প্রিফিক্সটি ফাঁকা রেখে দেওয়া হয়েছে, বালতির সমস্ত কীকে প্রভাবিত করে):

এখানে চিত্র বর্ণনা লিখুন


4
কিছু মুছুন কমান্ডের পরিবর্তে লাইফাইসাইকেল ব্যবহারের জন্য দুর্দান্ত ধারণা।
এক্সিস

অবিকল, এস 3 এটি আপনার জন্য করুন।
রায়ান

আপনি বালতি মুছতে সক্ষম করে পুরো বালতিতে এটি প্রয়োগ করতে পারেন।
ইন্ডুলার ইনডোলারিং

8

সঙ্গে s3cmdপ্যাকেজ লিনাক্স মেশিনে ইনস্টল, আপনি এটা করতে পারেন

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


4
সহায়তা অনুসারে এটি হয় একক-অবজেক্ট মুছুন s3cmd del s3://BUCKET/OBJECTবা পুরো বালতি মুছুন s3cmd rb s3://BUCKET। নেই s3cmd rm, অন্তত অনুযায়ী s3cmd --help
পল ম্যাকমার্ডি

s3cmd rm2019 এর সাহায্যে (দেলটির একটি নাম হিসাবে), এটি একটি দুর্দান্ত উত্তর। awsCLI সরঞ্জাম শুধুমাত্র একটি বিরুদ্ধে কাজ /উভয় ক্ষেত্রেই s3cmd কাজ যেহেতু সসীম উপসর্গ, কিন্তু না একটি ফোল্ডার এবং আংশিক ফাইলের নাম উপসর্গ। এই উত্তরটির জন্য আরও অনেকগুলি প্রয়োজনীয়তা রয়েছে, সঠিক সমাধানটি খুঁজে পেতে আমাকে অনেকদূর যেতে হবে।
ডেভিড পার্কস

8

আপনি যদি জাভা এডাব্লুএস এসডিকে ২.০ ব্যবহার করে "foo /" উপসর্গ সহ সমস্ত অবজেক্ট সরিয়ে নিতে চান তবে ক্ষেত্রে

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;
};

4
এই উত্তরের চেয়ে জাভা সম্পর্কে লোকেরা কী পছন্দ করে না তার আর বেশি কিছু বলার মতো বিক্ষোভের সন্ধান পাচ্ছি না ...
জীবন

3

রুবি ভি 2 এর জন্য অ্যাডাব্লুএস-এসকেডি ব্যবহারের ক্ষেত্রে।

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

আমি পাওয়ারশেল ব্যবহার করে আমার বালতি থেকে সমস্ত ফাইল সরিয়ে ফেলেছি:

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

এই উত্তরটি পোস্ট করার জন্য ধন্যবাদ, আমি এই সঠিক জিনিসটি করার চেষ্টা করছিলাম এবং - কে "% _। কী" রেখেছিলাম যা কাজ করে না।
স্কট গার্টনার


2

ভোট দেওয়া উত্তরটি একটি পদক্ষেপ মিস করছে।

প্রতি আ এস এস 3 সহায়তা:

বর্তমানে, কমান্ডের পাথ আর্গুমেন্টে ইউনিক্স স্টাইলের ওয়াইল্ডকার্ড ব্যবহারের জন্য কোনও সমর্থন নেই। তবে বেশিরভাগ কমান্ডের রয়েছে --exclude "<value>"এবং --include "<value>" প্যারামিটারগুলি যা পছন্দসই ফলাফল অর্জন করতে পারে ......... যখন একাধিক ফিল্টার থাকে, নিয়মটি হ'ল পরে যে কমান্ডটিতে প্রদর্শিত ফিল্টারগুলি কমান্ডের আগে উপস্থিত ফিল্টারগুলির চেয়ে অগ্রাধিকার গ্রহণ করে। উদাহরণস্বরূপ, যদি ফিল্ডের প্যারামিটারগুলি কমান্ডে প্রেরণ করা থাকে তবে --exclude "*" --include "*.txt".txt দিয়ে শেষ হওয়া ফাইল বাদে সমস্ত ফাইল কমান্ড থেকে বাদ দেওয়া হবে

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

0

পুরো বালতি সামগ্রী মুছে ফেলার জন্য লাইফাইসাইকেল নিয়ম ব্যবহার করা সবচেয়ে ভাল উপায়। প্রোগ্রামিয়ালি আপনি লাইফাইসাইকেল নিয়মে নীচের কোড (পিএইচপি) ব্যবহার করতে পারেন।

$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

এস 3 ম্যানেজমেন্ট কনসোলে বালতিটির চেকমার্কে ক্লিক করুন এবং উপরের ডানদিকের খালি বোতামটিতে ক্লিক করুন।


হ্যালো এবং তাই আপনাকে স্বাগতম! অনুগ্রহ করে পড়ুন সফর এবং আমি কিভাবে ভাল উত্তর লিখুন? উদাহরণস্বরূপ একটি স্ক্রিনশট সহায়ক হবে।
টোমর শেতাঃ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.