Amazon s3 如何从S3存储桶中递归删除文件
我在S3中有以下文件夹结构。是否有一种方法可以递归删除某个文件夹下的所有文件(例如Amazon s3 如何从S3存储桶中递归删除文件,amazon-s3,amazon-web-services,Amazon S3,Amazon Web Services,我在S3中有以下文件夹结构。是否有一种方法可以递归删除某个文件夹下的所有文件(例如foo/bar1或foo或foo/bar2/1) 这过去需要对每个密钥(文件)进行专用API调用,但由于在2011年12月引入了: 新的“多对象删除”使您能够 只需一次请求,即可从S3存储桶中删除多达1000个对象 请参阅我对相关问题的回答,以了解有关这一点以及PHP中的各个示例的更多信息(从那时起,PHP就支持这一点) 同时,大多数AWS客户端库都以某种方式引入了对该功能的专用支持,例如: python 您可以通
foo/bar1或foo或foo/bar2/1
)
这过去需要对每个密钥(文件)进行专用API调用,但由于在2011年12月引入了: 新的“多对象删除”使您能够 只需一次请求,即可从S3存储桶中删除多达1000个对象 请参阅我对相关问题的回答,以了解有关这一点以及PHP中的各个示例的更多信息(从那时起,PHP就支持这一点) 同时,大多数AWS客户端库都以某种方式引入了对该功能的专用支持,例如: python 您可以通过AWS的优秀Python接口实现这一点,大致如下(未经测试,从我的想法来看):
导入boto
s3=boto.connect_s3()
bucket=s3.获取bucket(“bucketname”)
bucketListResultSet=bucket.list(前缀=“foo/bar”)
结果=bucket.delete_key([bucketListResultSet中key的key.name])
红宝石
这是可用的,因为的和发行说明也提供了一个示例:
bucket=AWS::S3.new.bucket['mybucket']
#按键删除对象列表,每1k批量删除对象
#请求。接受字符串、AWS::S3::S3Object、AWS::S3::ObectVersion和
#使用:key和:version\u id散列
删除('key1','key2','key3',…)
#删除bucket中的所有对象(可选使用公共前缀,如图所示)
bucket.objects.with_前缀('2009/')。全部删除
#条件删除,仅以1k为单位批量加载和删除对象
#从块中删除那些返回true的
如果{124; object{124; object.key=~/\.pdf$/}删除{u
#清空bucket,然后删除bucket,1k批量删除对象
bucket.delete!
或:
您还可以考虑使用Amazon S3生命周期来创建具有前缀“代码> Foo/BAR1”的文件过期。
打开S3浏览器控制台并单击一个bucket。然后单击属性,然后单击生命周期 为前缀为foo/bar1
的所有文件创建过期规则,并将日期设置为文件创建后的1天
保存,所有匹配的文件将在24小时内消失
完成后别忘了删除规则
没有API调用,没有第三方库、应用程序或脚本
我只是用这种方式删除了几百万个文件
显示生命周期规则窗口的屏幕截图(注意,在该截图中,前缀留空,影响bucket中的所有键):
对于最新版本,递归删除bucket中某个文件夹下的所有文件只需:
aws s3 rm --recursive s3://your_bucket_name/foo/
或者删除bucket下的所有内容:
aws s3 rm --recursive s3://your_bucket_name
如果您想要实际删除该bucket,则有一个单步快捷方式:
aws s3 rb --force s3://your_bucket_name
这将递归删除该存储桶中的内容,然后删除该存储桶
注意:
s3://
协议前缀是这些命令工作所必需的我刚刚使用PowerShell从我的存储桶中删除了所有文件:
Get-S3Object -BucketName YOUR_BUCKET | % { Remove-S3Object -BucketName YOUR_BUCKET -Key $_.Key -Force:$true }
最好的方法是使用生命周期规则删除整个bucket内容。通过编程,您可以使用以下代码(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',
),
),
));
在上述情况下,所有对象将从开始日期-“今天GMT午夜”删除
您还可以按如下方式指定天数。但对于天,它将等待至少24小时(至少1天)开始删除桶中的内容
$expiration = array('Days' => 1);
通过在Linux机器上安装
s3cmd
软件包,您可以做到这一点
s3cmd rm s3://foo/bar——递归
刚刚看到Amazon在AWS控制台菜单中添加了“如何清空存储桶”选项:
我需要执行以下操作
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
在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
请注意,bucket下的所有“foo/*”都将被删除。如果您想使用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;
};
import java.util.ArrayList;
导入java.util.Iterator;
导入software.amazon.awssdk.services.s3.S3Client;
导入software.amazon.awssdk.services.s3.model.*;
//...
ListObjectsRequest ListObjectsRequest=ListObjectsRequest.builder()
.bucket(bucketName)
.前缀(“foo/”)
.build()
;
ListObjectsResponse objectsResponse=s3Client.listObjects(listObjectsRequest);
while(true){
ArrayList对象=新的ArrayList();
for(Iterator Iterator=objectsResponse.contents().Iterator();Iterator.hasNext();){
S3Object S3Object=(S3Object)迭代器.next();
objects.add(
ObjectIdentifier.builder()
.key(s3Object.key())
.build()
);
}
s3Client.deleteObjects(
DeleteObjectsRequest.builder()
.bucket(bucketName)
.删除(
Delete.builder()
.对象(对象)
.build()
)
.build()
);
if(objectsResponse.isTruncated()){
objectsResponse=s3Client.listObjects(listObjectsRequest);
继续;
}
打破
};
投票通过的答案缺少一个步骤
根据aws s3帮助:
目前,不支持在应用程序中使用UNIX样式的通配符
命令的路径参数。但是,大多数命令都有--exclude”“
和--include”“
参数,可以实现
期望的结果。。。。。。。。。当有多个
过滤器,规则是稍后在命令take中出现的过滤器
优先于在命令前面出现的过滤器。例如,如果传递给命令的筛选器参数为--exclude“*”
--include“*.txt”
则除了结束的文件之外,所有文件都将从命令中排除
with.txt
在S3管理控制台中,单击bucket的复选标记,然后单击顶部r的empty按钮
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
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;
};
aws s3 rm --recursive s3://bucket/ --exclude="*" --include="/folder_path/*"