119

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/..
4

12 に答える 12

221

最新のaws-cli python コマンド ライン ツールを使用して、バケット内のフォルダーの下にあるすべてのファイルを再帰的に削除するには、次のようにします。

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

または、バケットの下のすべてを削除します。

aws s3 rm --recursive s3://your_bucket_name

実際にバケットを削除したい場合は、1 ステップのショートカットがあります。

aws s3 rb --force s3://your_bucket_name

そのバケットの内容を再帰的に削除してから、バケットを削除します。

注:s3://これらのコマンドが機能するには、プロトコル プレフィックスが必要です。

于 2013-09-09T12:28:41.627 に答える
62

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

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

関連する質問delete from S3 using api php using wildcardに対する私の回答を参照して、これと PHP でのそれぞれの例を確認してください (バージョン 1.4.8以降、 AWS SDK for PHPはこれをサポートしています)。

一方、ほとんどの AWS クライアント ライブラリは、何らかの方法でこの機能の専用サポートを導入しています。たとえば、次のようになります。

パイソン

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)
于 2012-04-07T14:33:27.190 に答える
46

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

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

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

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

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

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

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

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

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

于 2012-11-19T04:13:04.370 に答える
10

パッケージを Linux マシンにインストールすると、これs3cmdを実行できます。

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

于 2015-08-20T18:50:32.937 に答える
3

ruby V2に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/*」は全て削除されますのでご注意ください。

于 2016-02-26T11:37:46.013 に答える
2

Amazon が「バケットを空にする方法」オプションを AWS コンソール メニューに追加したことを確認しました。

http://docs.aws.amazon.com/AmazonS3/latest/UG/DeletingaBucket.html

于 2015-09-17T12:44:12.450 に答える
2

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

Get-S3Object -BucketName YOUR_BUCKET | % { Remove-S3Object -BucketName YOUR_BUCKET -Key $_.Key -Force:$true }
于 2014-11-02T05:31:38.277 に答える
0

特定のフォルダの下にあるオブジェクトのすべてのバージョンを削除するには:

/folder/subfolder/プレフィックスへのパスを渡します -


import boto3

s3 = boto3.resource('s3')
bucket = s3.Bucket("my-bucket-name")
bucket.object_versions.filter(Prefix="foo/bar1/1/").delete()
于 2021-06-09T02:43:49.243 に答える