如何从S3桶递归地删除文件(How to delete files recursively from

2019-07-28 20:42发布

我在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/..

Answer 1:

With the latest aws-cli python command line tools, to recursively delete all the files under a folder in a bucket is just:

aws s3 rm --recursive s3://your_bucket_name/foo/

Or delete everything under the bucket:

aws s3 rm --recursive s3://your_bucket_name

If what you want is to actually delete the bucket, there is one-step shortcut:

aws s3 rb --force s3://your_bucket_name

which will remove the contents in that bucket recursively then delete the bucket.

Note: the s3:// protocol prefix is required for these commands to work



Answer 2:

过去,这需要为每个键(文件)专用的API调用,但由于引入了极大的简化亚马逊S3 -多目标删除在2011年12月:

亚马逊S3的新多目标删除使您能够从S3斗删除多达1000个对象有一个请求的能力。

见我的回答相关问题使用通配符使用PHP API从S3删除为了了解更多关于PHP这一点,各例(在AWS SDK的PHP支持这一点,因为1.4.8版本 )。

大部分AWS客户端库都同时推出了这一功能的一种方式或其他,如专门的支持:

蟒蛇

你可以用出色的做到这一点博托 Python接口AWS大致如下(未经测试,从我的头顶):

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

红宝石

这是可用,因为1.24版本中的AWS SDK为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)


Answer 3:

你也可以考虑使用亚马逊S3的生命周期来创建带有前缀的文件过期foo/bar1

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

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

保存并全部匹配的文件将在24小时内消失。

只是不要忘记删除的规则大功告成了!

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

我只是删除了数百万的文件这样。

屏幕截图显示了生命周期规则窗口(在此拍摄注:前缀是空白的,影响到桶中的所有键):



Answer 4:

在情况下,如果要删除使用Java AWS SDK 2.0“富/”前缀的所有对象

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;
};


Answer 5:

我只是删除从我的桶中的所有文件使用PowerShell的:

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


Answer 6:

随着s3cmd安装在Linux机器上的包,你可以这样做

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



Answer 7:

在使用AWS-SKD红宝石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

请注意,所有的下斗“富/ *”将删除。



Answer 8:

Just saw that Amazon added a "How to Empty a Bucket" option to the AWS console menu:

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



Answer 9:

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


Answer 10:

我需要做下面...

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


Answer 11:

该投了答案中缺少一个步骤。

每AWS S3的帮助:

目前,在命令的路径参数使用UNIX风格的通配符不支持。 然而,大多数命令具有--exclude "<value>"--include "<value>" ,可以实现所期望的结果参数.........当有多个过滤器,所述规则是过滤器出现在命令后优先于先前在命令中出现的过滤器。 例如,如果传递给命令滤波器参数为--exclude "*" --include "*.txt"所有文件都将在命令排除文件以txt结尾除

aws s3 rm --recursive s3://bucket/ --exclude="*" --include="/folder_path/*" 


文章来源: How to delete files recursively from an S3 bucket