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/..
回答:
最新の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://
これらのコマンドが機能するには、プロトコルプレフィックスが必要です
rm
ファイルのみを削除しますがrb --force
、ファイルとバケットを削除します。
--recursive
、フォルダも削除されます。
これは、キー(ファイル)ごとに専用の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クライアントライブラリは、この機能の専用サポートを何らかの方法で導入しています。例:
これは、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)
Amazon S3ライフサイクルを使用して、プレフィックスがfoo/bar1
。のファイルの有効期限を作成することも検討してください。
S3ブラウザコンソールを開き、バケットをクリックします。次に、[プロパティ]、[ライフサイクル]の順にクリックします。
プレフィックスが付いたすべてのファイルの有効期限ルールを作成し、foo/bar1
ファイルが作成されてから1日に日付を設定します。
保存すると、一致するすべてのファイルが24時間以内に削除されます。
完了したら、ルールを削除することを忘れないでください。
API呼び出し、サードパーティのライブラリ、アプリ、スクリプトはありません。
この方法で数百万のファイルを削除しました。
ライフサイクルルールウィンドウを示すスクリーンショット(このショットでは、プレフィックスが空白のままになっており、バケット内のすべてのキーに影響します):
でs3cmd
Linuxマシンにインストールされたパッケージ、あなたはこれを行うことができます
s3cmd rm s3://foo/bar --recursive
s3cmd del s3://BUCKET/OBJECT
またはバケット全体の削除のいずれかs3cmd rb s3://BUCKET
です。s3cmd rm
少なくともによると、はありませんs3cmd --help
。
s3cmd rm
2019年の時点で(delのエイリアスとして)ヘルプにありますが、これは優れた回答です。aws
CLIツールのみに対する仕事/
の両方のケースでs3cmd作品に対し終端接頭辞ではなく、フォルダやファイル名の一部の接頭辞、。この答えにはもっと多くの賛成票が必要です。正しい解決策を見つけるには、スクロールしすぎなければなりませんでした。
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;
};
PowerShellを使用してバケットからすべてのファイルを削除しました。
Get-S3Object -BucketName YOUR_BUCKET | % { Remove-S3Object -BucketName YOUR_BUCKET -Key $_.Key -Force:$true }
AmazonがAWSコンソールメニューに「バケットを空にする方法」オプションを追加したのを見たばかりです。
http://docs.aws.amazon.com/AmazonS3/latest/UG/DeletingaBucket.html
投票された回答にはステップがありません。
aws s3ヘルプごと:
現在、コマンドのパス引数でのUNIXスタイルのワイルドカードの使用はサポートされていません。ただし、ほとんどのコマンドには 、目的の結果を達成できるパラメーターが
--exclude "<value>"
あり--include "<value>"
ます.........複数のフィルターがある場合、コマンドの後半に表示されるフィルターが、コマンドの前に表示されるフィルターよりも優先されるという規則があります。たとえば、コマンドに渡されたフィルターパラメーターが次の場合、--exclude "*"
--include "*.txt"
.txtで終わるファイルを除くすべてのファイルがコマンドから除外されます
aws s3 rm --recursive s3://bucket/ --exclude="*" --include="/folder_path/*"
最良の方法は、ライフサイクルルールを使用してバケットの内容全体を削除することです。プログラムで、次のコード(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);
私は次のことをする必要がありました...
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