如何从S3存储桶recursion删除文件

我在S3中有以下文件夹结构。 有没有办法recursion删除某个文件夹下的所有文件(如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-cli python命令行工具 ,recursion删除一个文件夹下的所有文件只是:

 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 

这将recursion地删除该桶中的内容,然后删除该桶。

注意: s3://协议前缀是这些命令工作所必需的

过去,每个密钥(文件)都需要专门的API调用,但是由于2011年12月推出了Amazon S3 – 多对象删除function ,因此已经大大简化:

Amazon S3的新型多对象删除function使您可以使用单个请求从S3存储桶中删除多达1000个对象。

看到我的回答相关的问题从S3使用API​​通过使用通配符删除更多的这个和在PHP中的相应的例子(PHP的PHP SDK从1.4.8版本支持这个)。

大多数AWS客户端库同时都以这种或那种方式引入了对此function的专门支持,例如:

python

你可以用AWS的优秀boto Python界面来实现这个function(大致如下)(从我的头顶开始未经testing):

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

ruby

这是适用于Ruby的AWS开发工具包 版本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文件创build到期。

打开S3浏览器控制台,然后单击一个存储桶。 然后点击属性,然后点击LifeCycle。

为所有具有前缀foo/bar1文件创build过期规则,并将date设置为自创build文件以来的1天。

保存和所有匹配的文件将在24小时内消失。

完成后请不要忘记删除规则!

没有API调用,没有第三方库,应用程序或脚本。

我刚刚以这种方式删除了数百万个文件。

显示“生命周期规则”窗口的屏幕截图(请注意,在此镜头中,前缀已空白,影响存储桶中的所有键):

在这里输入图像说明

我刚刚使用PowerShell从我的存储桶中删除了所有文件:

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

通过在Linux机器上安装s3cmd软件包,您可以执行此操作

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

如果使用AWS-SKD的rubyV2。

 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 / *”都会删除。

最好的方法是使用生命周期规则删除整个桶内容。 以编程方式,您可以使用下面的代码(PHP)来生命周期规则。

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

在上面的情况下,所有的对象将被删除开始date – “今天GMT午夜”。

您也可以指定天数如下。 但是有了天,它将至less等待24小时(最less1天)开始删除存储桶内容。

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

刚刚看到,亚马逊已经将空桶添加到那里的AWS控制台菜单。

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

我需要做以下…

 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 

如果您想要使用Java AWS SDK 2.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; };