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-clipythonコマンドラインツールを使用すると、バケット内のフォルダーの下にあるすべてのファイルを再帰的に削除できます。

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
これが答えになるはずです。これは(新しい)標準の強力なツールであり、この質問のようなもののために設計されています
Don Cheadle 2015年

これはファイルを問題なく削除しますが、ファイルを削除した後にバケットも削除します。私は何かを逃しましたか?
naveen 2015年

1
@Naveenは、上記で述べたように、rmファイルのみを削除しますがrb --force、ファイルバケットを削除します。
number5 2015年

5
を使用すると--recursive、フォルダも削除されます。
ryantuck 2016

1
@Moseleyi s3バケットに空のフォルダーを実際に含めることはできないと思います
ryantuck 2017年

58

これは、キー(ファイル)ごとに専用のAPI呼び出しを必要としていましたが、2011年12月にAmazon S3-Multi-Object Deleteが導入されたため、大幅に簡素化されました。

Amazon S3の新しいマルチオブジェクト削除では、1回のリクエストでS3バケットから最大1000個のオブジェクトを削除できます。

これとPHPのそれぞれの例の詳細については、ワイルドカード使用したapi phpを使用したS3からの削除に関する私の回答を参照してください(AWS SDK for PHPバージョン1.4.8以降これをサポートしています)。

一方、ほとんどのAWSクライアントライブラリは、この機能の専用サポートを何らかの方法で導入しています。例:

Python

これは、AWSへの優れたboto Pythonインターフェースを使用して、大まかに次のように実現できます(テストされていない、私の頭の上から)。

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

ルビー

これは、AWS SDK for Rubyのバージョン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)

aws clidocs.aws.amazon.com/cli/latest/reference/s3/rm.htmlの下の@ number5のような新しい回答を使用する必要があります
Don Cheadle

43

Amazon S3ライフサイクルを使用して、プレフィックスがfoo/bar1。のファイルの有効期限を作成することも検討してください。

S3ブラウザコンソールを開き、バケットをクリックします。次に、[プロパティ]、[ライフサイクル]の順にクリックします。

プレフィックスが付いたすべてのファイルの有効期限ルールを作成し、foo/bar1ファイルが作成されてから1日に日付を設定します。

保存すると、一致するすべてのファイルが24時間以内に削除されます。

完了したら、ルールを削除することを忘れないでください。

API呼び出し、サードパーティのライブラリ、アプリ、スクリプトはありません。

この方法で数百万のファイルを削除しました。

ライフサイクルルールウィンドウを示すスクリーンショット(このショットでは、プレフィックスが空白のままになっており、バケット内のすべてのキーに影響します):

ここに画像の説明を入力してください


4
削除コマンドの代わりにライフサイクルを使用することをお勧めします。
xis 2014年

まさに、S3に任せてください。
ライアン

これをバケット全体に適用して、バケットを削除することもできます。
2014年

8

s3cmdLinuxマシンにインストールされたパッケージ、あなたはこれを行うことができます

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


1
ヘルプによると、それは単一オブジェクトの削除s3cmd del s3://BUCKET/OBJECTまたはバケット全体の削除のいずれかs3cmd rb s3://BUCKETです。s3cmd rm少なくともによると、はありませんs3cmd --help
Paul McMurdie 2015

s3cmd rm2019年の時点で(delのエイリアスとして)ヘルプにありますが、これは優れた回答です。awsCLIツールのみに対する仕事/の両方のケースでs3cmd作品に対し終端接頭辞ではなく、フォルダやファイル名の一部の接頭辞、。この答えにはもっと多くの賛成票が必要です。正しい解決策を見つけるには、スクロールしすぎなければなりませんでした。
デビッドパークス

8

Java AWS SDK2.0を使用してプレフィックスが「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;
};

1
この答えよりも、人々がJavaについて
嫌い

3

RubyV2に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

注意してください、バケットの下のすべての「foo / *」は削除されます。


2

PowerShellを使用してバケットからすべてのファイルを削除しました。

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

この回答を投稿してくれてありがとう、私はこれを正確にやろうとしていて、動作しない-Key "%_。Key"を入れていました。
スコットガートナー2015年


1

投票された回答にはステップがありません。

aws s3ヘルプごと:

現在、コマンドのパス引数でのUNIXスタイルのワイルドカードの使用はサポートされていません。ただし、ほとんどのコマンドには 、目的の結果を達成できるパラメーターが --exclude "<value>"あり--include "<value>"ます.........複数のフィルターがある場合、コマンドの後半に表示されるフィルターが、コマンドの前に表示されるフィルターよりも優先されるという規則があります。たとえば、コマンドに渡されたフィルターパラメーターが次の場合、--exclude "*" --include "*.txt".txtで終わるファイルを除くすべてのファイルがコマンドから除外されます

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

0

最良の方法は、ライフサイクルルールを使用してバケットの内容全体を削除することです。プログラムで、次のコード(PHP)を使用してライフサイクルルールをPUTできます。

$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午前0時」。

次のように日を指定することもできます。ただし、Daysでは、バケットの内容の削除を開始するために少なくとも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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.