How to delete files recursively from an S3 bucket

后端 未结 12 603
不知归路
不知归路 2021-01-29 23:54

I have the following folder structure in S3. Is there a way to recursively remove all files under a certain folder (say foo/bar1 or foo or foo/bar2/1 ..)

         


        
12条回答
  •  轮回少年
    2021-01-30 00:43

    This used to require a dedicated API call per key (file), but has been greatly simplified due to the introduction of Amazon S3 - Multi-Object Delete in December 2011:

    Amazon S3's new Multi-Object Delete gives you the ability to delete up to 1000 objects from an S3 bucket with a single request.

    See my answer to the related question delete from S3 using api php using wildcard for more on this and respective examples in PHP (the AWS SDK for PHP supports this since version 1.4.8).

    Most AWS client libraries have meanwhile introduced dedicated support for this functionality one way or another, e.g.:

    Python

    You can achieve this with the excellent boto Python interface to AWS roughly as follows (untested, from the top of my head):

    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

    This is available since version 1.24 of the AWS SDK for Ruby and the release notes provide an example as well:

    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!
    

    Or:

    AWS::S3::Bucket.delete('your_bucket', :force => true)
    

提交回复
热议问题