Dosyaları bir S3 klasöründen yinelemeli olarak silme


90

S3'te aşağıdaki klasör yapısına sahibim. Belirli bir klasör altındaki tüm dosyaları tekrar tekrar kaldırmanın bir yolu var mı (örneğin 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/..

Yanıtlar:


169

En yeni aws-cli python komut satırı araçlarıyla , bir kova içindeki bir klasörün altındaki tüm dosyaları yinelemeli olarak silmek için sadece:

aws s3 rm --recursive s3://your_bucket_name/foo/

Veya paketin altındaki her şeyi silin:

aws s3 rm --recursive s3://your_bucket_name

İstediğiniz şey aslında paketi silmekse, tek adımlı bir kısayol vardır:

aws s3 rb --force s3://your_bucket_name

bu, söz konusu paketteki içerikleri yinelemeli olarak kaldırır ve ardından paketi siler.

Not: s3://Bu komutların çalışması için protokol öneki gereklidir


2
cevap bu olmalı. Bu, (yenimsi) standart, güçlü bir araçtır ve tıpkı bu soruya benzer şeyler için tasarlanmıştır
Don Cheadle

Bu, dosyaları siliyor, ancak dosyaları sildikten sonra grubu da siliyor. Bir şey mi kaçırdım?
Naveen

1
@Naveen yukarıda söylediğim gibi rmsadece dosyaları rb --forcesilecek, ancak dosyaları ve demeti silecektir .
sayı5

5
kullanmak --recursiveklasörü de siler.
ryantuck

2
@Moseleyi Bir s3 kovasında aslında boş bir klasörünüz olamayacağına inanıyorum
ryantuck

58

Bu, eskiden anahtar (dosya) başına özel bir API çağrısı gerektiriyordu, ancak Aralık 2011'de Amazon S3 - Çok Nesneli Silme'nin kullanıma sunulmasıyla büyük ölçüde basitleştirildi :

Amazon S3'ün yeni Çoklu Nesne Silme özelliği, size tek bir istekle bir S3 klasöründen 1000 adede kadar nesneyi silme olanağı sağlar.

Bu ve PHP'deki ilgili örnekler hakkında daha fazla bilgi için api php kullanarak api php kullanarak S3'ten silme ile ilgili soruya verdiğim cevaba bakın (PHP için AWS SDK bunu sürüm 1.4.8'den beri desteklemektedir ).

Çoğu AWS istemci kitaplığı bu arada bu işlevsellik için şu veya bu şekilde özel destek sağlamıştır, örneğin:

Python

Bunu, AWS'ye mükemmel boto Python arayüzü ile kabaca aşağıdaki gibi (test edilmemiş, kafamın üstünden) başarabilirsiniz :

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])

Yakut

Bu, Ruby için AWS SDK'nın 1.24 sürümünden beri mevcuttur ve sürüm notları da bir örnek sağlar:

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!

Veya:

AWS::S3::Bucket.delete('your_bucket', :force => true)


43

Ön eke sahip dosyalar için bir son kullanma tarihi oluşturmak için Amazon S3 Yaşam Döngüsü kullanmayı da düşünebilirsiniz foo/bar1.

S3 tarayıcı konsolunu açın ve bir gruba tıklayın. Ardından Özellikler'e ve ardından Yaşam Döngüsü'ne tıklayın.

Önek ile tüm dosyalar için bir sona erme kuralı oluşturun foo/bar1ve tarihi dosyanın oluşturulmasından itibaren 1 gün olarak ayarlayın.

Kaydedildiğinde tüm eşleşen dosyalar 24 saat içinde silinecektir.

İşiniz bittikten sonra kuralı kaldırmayı unutmayın!

API çağrısı yok, üçüncü taraf kitaplıkları, uygulamaları veya komut dosyaları yok.

Bu şekilde birkaç milyon dosyayı sildim.

Yaşam Döngüsü Kuralı penceresini gösteren bir ekran görüntüsü (bu çekimde Önekin paketteki tüm anahtarları etkileyecek şekilde boş bırakıldığına dikkat edin):

görüntü açıklamasını buraya girin


4
Bazı silme komutları yerine Lifecycle kullanmak için harika bir fikir.
xis

Kesinlikle, bırakın S3 sizin için yapsın.
Ryan

Bunu tüm pakete uygulayarak paketi silmenizi de sağlayabilirsiniz.
Indolering

8

İle s3cmdpaket bir Linux makine yüklü, bunu yapabilirsin

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


1
Yardıma göre ya tek nesneli silme s3cmd del s3://BUCKET/OBJECTya da tüm paket silme s3cmd rb s3://BUCKET. Hayır s3cmd rm, en azından göre s3cmd --help.
Paul McMurdie

s3cmd rm2019 itibariyle yardımda (del için bir takma ad olarak), bu mükemmel bir cevap. awsCli araçlar sadece karşı çalışma /her iki durumda da s3cmd eserler ise sonlandırma öneki, ancak bir klasör ve kısmi dosya adı öneki. Bu yanıtın çok daha fazla oy alması gerekiyor, doğru çözümü bulmak için çok ileriye gitmem gerekti.
David Parks

8

Java AWS SDK 2.0 kullanarak "foo /" ön ekine sahip tüm nesneleri kaldırmak istemeniz durumunda

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
İnsanların Java ile ilgili neyi sevmediklerine dair bu cevaptan daha açıklayıcı bir gösteri bulamıyorum ...
Jivan

3

Ruby V2 için AWS-SKD kullanılması durumunda.

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

dikkat lütfen, kova altındaki tüm "foo / *" silinecek.


2

PowerShell'i kullanarak paketimdeki tüm dosyaları kaldırdım:

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

Bu yanıtı gönderdiğiniz için teşekkürler, tam olarak bunu yapmaya çalışıyordum ve işe yaramayan -Key "% _. Key" anahtarını koymuştum.
Scott Gartner


2

Oylanan cevapta bir adım eksik.

Aws s3 yardımı için:

Şu anda, bir komutun yol argümanlarında UNIX tarzı joker karakterlerin kullanımı desteklenmemektedir. Bununla birlikte, çoğu komutun istenen sonucu elde edebilecek --exclude "<value>"ve --include "<value>"parametreleri vardır ......... Birden çok filtre olduğunda, kural, komutta daha sonra görünen filtrelerin komutta daha önce görünen filtrelere göre öncelikli olmasıdır. Örneğin, komuta iletilen filtre parametreleri --exclude "*" --include "*.txt"Tüm dosyalar şeklindeyse, .txt ile biten dosyalar hariç olmak üzere, komuttan hariç tutulacaktır.

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

0

En iyi yol, tüm paket içeriğini silmek için yaşam döngüsü kuralını kullanmaktır. Programlı olarak, PUT yaşam döngüsü kuralı için aşağıdaki kodu (PHP) kullanabilirsiniz.

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

Yukarıdaki durumda tüm nesneler başlangıç ​​Tarihi - "Bugün GMT Gece yarısı" silinecektir.

Günleri aşağıdaki gibi de belirtebilirsiniz. Ancak Days ile, paket içeriğini silmeye başlamak için en az 24 saat (minimum 1 gün) bekler.

$expiration = array('Days' => 1);

0

Aşağıdakileri yapmam gerekiyordu ...

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.