如何从S3存储桶中递归删除文件

时间:2012-04-07 13:43:05

标签: amazon-s3 amazon-web-services

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

13 个答案:

答案 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客户端库同时以这种或那种方式引入了对此功能的专用支持,例如:

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

红宝石

这是version 1.24AWS 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调用,没有第三方库,应用程序或脚本。

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

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

enter image description here

答案 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 管理控制台中,单击存储桶的复选标记,然后单击右上角的空按钮。