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

如果您想要实际删除存储桶,则有一步捷径:

aws s3 rb --force s3://your_bucket_name

这将递归删除该存储桶中的内容,然后删除该存储桶。

注意:s3://这些命令需要协议前缀才能工作

于 2013-09-09T12:28:41.627 回答
62

这过去需要对每个密钥(文件)进行专门的 API 调用,但由于在 2011 年 12 月引入了Amazon S3 - 多对象删除,这已大大简化:

Amazon S3 的新多对象删除功能使您能够通过单个请求从 S3 存储桶中删除多达 1000 个对象。

请参阅我对相关问题delete from S3 using api php using wildcard的回答,了解有关此内容和 PHP 中相应示例的更多信息(AWS SDK for PHP自版本 1.4.8起支持此功能)。

大多数 AWS 客户端库同时以一种或另一种方式引入了对此功能的专门支持,例如:

Python

您可以使用 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])

红宝石

这从适用于 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)
于 2012-04-07T14:33:27.190 回答
46

您也可以考虑使用 Amazon S3 Lifecycle 为前缀为 的文件创建过期时间foo/bar1

打开 S3 浏览器控制台并单击存储桶。然后单击属性,然后单击生命周期。

为所有带有前缀的文件创建过期规则,foo/bar1并将日期设置为文件创建后的 1 天。

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

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

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

我只是以这种方式删除了几百万个文件。

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

在此处输入图像描述

于 2012-11-19T04:13:04.370 回答
10

s3cmdLinux 机器上安装软件包后,您可以执行此操作

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

于 2015-08-20T18:50:32.937 回答
8

如果您想使用 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;
};
于 2017-11-13T03:22:22.800 回答
8

投票赞成的答案缺少一步。

根据 aws s3 帮助:

目前,不支持在命令的路径参数中使用 UNIX 样式的通配符。但是,大多数命令都有 可以达到预期结果--exclude "<value>"--include "<value>" 参数......... 当有多个过滤器时,规则是命令中后面出现的过滤器优先于命令中前面出现的过滤器。例如,如果传递给命令的过滤器参数是--exclude "*" --include "*.txt"除以 .txt 结尾的文件外,所有文件都将从命令中排除

aws s3 rm --recursive s3://bucket/ --exclude="*" --include="/folder_path/*" 
于 2019-01-22T23:16:58.033 回答
3

如果将 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

请注意,bucket下的所有“foo/*”都会被删除。

于 2016-02-26T11:37:46.013 回答
2

I just removed all files from my bucket by using PowerShell:

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

刚刚看到亚马逊在 AWS 控制台菜单中添加了“如何清空存储桶”选项:

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

于 2015-09-17T12:44:12.450 回答
1

最好的方法是使用生命周期规则来删除整个存储桶内容。以编程方式,您可以使用以下代码 (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',
                ),
            ),
        ));

在上述情况下,将从日期开始删除所有对象 - “今天格林威治标准时间午夜”。

您还可以按如下方式指定天数。但是对于 Days,它将等待至少 24 小时(最少 1 天)才能开始删除存储桶内容。

$expiration = array('Days' => 1);
于 2015-05-08T20:06:53.110 回答
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
于 2015-11-11T08:39:34.463 回答
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 回答