我在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/..
答案 0 :(得分:117)
使用最新的aws-cli python command line tools,以递归方式删除存储桶中文件夹下的所有文件只是:
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://
协议前缀
答案 1 :(得分:53)
过去需要为每个密钥(文件)提供专用的API调用,但由于2011年12月引入了Amazon S3 - Multi-Object Delete,因此大大简化了:
Amazon S3's新的多对象删除功能使您能够执行此操作 使用单个请求从S3存储桶中删除最多1000个对象。
请参阅我对相关问题delete from S3 using api php using wildcard的回答,了解有关此问题的更多信息以及PHP中的相应示例(AWS SDK for PHP支持此version 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])
这是version 1.24的AWS SDK for Ruby后可用的,发行说明也提供了一个示例:
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)
答案 2 :(得分:40)
您可能还会考虑使用Amazon S3生命周期为前缀为foo/bar1
的文件创建过期。
打开S3浏览器控制台并单击存储桶。然后单击“属性”,然后单击“LifeCycle”。
为所有前缀为foo/bar1
的文件创建过期规则,并将日期设置为自创建文件后的1天。
保存并且所有匹配的文件将在24小时内消失。
完成后不要忘记删除规则!
没有API调用,没有第三方库,应用程序或脚本。
我刚刚以这种方式删除了数百万个文件。
显示生命周期规则窗口的屏幕截图(在此镜头中注意,前缀已留空,影响存储桶中的所有键):
答案 3 :(得分:3)
如果您想使用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;
};
答案 4 :(得分:2)
我刚刚使用PowerShell删除了我的存储桶中的所有文件:
Get-S3Object -BucketName YOUR_BUCKET | % { Remove-S3Object -BucketName YOUR_BUCKET -Key $_.Key -Force:$true }
答案 5 :(得分:2)
在Linux计算机上安装s3cmd
软件包,您可以执行此操作
s3cmd rm s3://foo/bar --recursive
答案 6 :(得分:1)
刚刚看到亚马逊添加了一个&#34;如何清空水桶&#34; AWS控制台菜单的选项:
http://docs.aws.amazon.com/AmazonS3/latest/UG/DeletingaBucket.html
答案 7 :(得分:1)
如果将AWS-SKD用于ruby V2。
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
请注意,所有&#34; foo / *&#34;桶下将删除。
答案 8 :(得分:0)
最好的方法是使用生命周期规则删除整个桶内容。以编程方式,您可以使用以下代码(PHP)来生成PUT生命周期规则。
$expiration = array('Days' => 1);
在上述情况下,所有对象将从开始日期 - “今天GMT午夜”删除。
您还可以按如下方式指定天数。但是使用Days它将等待至少24小时(最少1天)才能开始删除存储桶内容。
int main(int argc, char** argv)
{
int shmid;
int *shmptr;
int N = 10;
// Create shared memory segment
if ((shmid = shmget(IPC_PRIVATE, N * N * sizeof(int), 0600)) < 0)
{
puts("parent: shmget error");
return -1;
}
// Attach shared memory segment
if ((shmptr = shmat(shmid, 0, 0)) == (void *) -1)
{
puts("parent: shmat error");
return -1;
}
int ret = fork();
if (ret == 0)
{
int status = 0;
if (wait(&status) == -1)
{
puts("parent: Child terminated on error.");
}
else
{
printf("parent: status of child: %d\n", status);
}
puts("parent: End parent.");
}
else
{
puts("child: End child.");
_exit(0);
}
exit(0);
}
答案 9 :(得分: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
答案 10 :(得分:0)
已投票的答案缺少一步。 注意:堆栈溢出会解析出星号,因此在下面的示例中,我们使用文本“ star”作为占位符。谢谢!
每个AWS S3帮助:
Blockquote 当前,不支持在UNIX样式的通配符中使用UNIX样式的通配符。 命令的路径参数。但是,大多数命令都有--exclude “”和--include“”参数可以实现 预期的结果.........当有多个 过滤器,规则是稍后在命令take中出现的过滤器 优先于命令前面显示的过滤器。例如,如果传递给命令的过滤器参数为--exclude“ star” --include“ star.txt”,则所有文件都将被排除在命令之外,但文件结尾 使用.txt
aws s3 rm --recursive s3://bucket/ --exclude="star" --include="/folder_path/star"
请注意,文件夹路径后必须有一个星星
答案 11 :(得分:0)
要删除特定文件夹下对象的所有版本:
将路径 /folder/subfolder/
传递给前缀 -
import boto3
s3 = boto3.resource('s3')
bucket = s3.Bucket("my-bucket-name")
bucket.object_versions.filter(Prefix="foo/bar1/1/").delete()
答案 12 :(得分:-1)
在 S3 管理控制台中,单击存储桶的复选标记,然后单击右上角的空按钮。