如何使用boto3删除AWS桶中的文件夹及其内容

时间:2017-05-12 18:19:13

标签: python amazon-web-services amazon-s3 boto3

关于如何删除文件夹的内容,documentation有点模棱两可。如果你看看它是如何为boto3完成的,那么key在boto3前面的部分中没有定义,它只在boto2例子中定义。

删除文件夹内容的灵活性(超过1000个文件)成语是什么?

3 个答案:

答案 0 :(得分:8)

我认为你不能在boto2中的一个成语中删除1000多个项目。但是,从boto3的角度来看,您可以尝试以下方法:

s3 = boto3.resource('s3')
bucket = s3.Bucket('bucket-name')
bucket.objects.filter(Prefix="path/to/dir").delete()

上述内容经过测试并正在运行

>>> import boto3
>>> s3 = boto3.resource('s3')
>>> b = s3.Bucket('MY_BUCKET_NAME')
>>> b.objects.filter(Prefix="test/stuff")
s3.Bucket.objectsCollection(s3.Bucket(name='MY_BUCKET_NAME'), s3.ObjectSummary)
>>> list(b.objects.filter(Prefix="test/stuff"))
[s3.ObjectSummary(bucket_name='MY_BUCKET_NAME', key=u'test/stuff/new')]
>>> b.objects.filter(Prefix="test/stuff").delete()
[{u'Deleted': [{u'Key': 'test/stuff/new'}], 'ResponseMetadata': {'HTTPStatusCode': 200, 'RetryAttempts': 0, 'HostId': 'BASE64_ID_1', 'RequestId': 'REQ_ID', 'HTTPHeaders': {'x-amz-id-2': 'BASE64_ID_2', 'server': 'AmazonS3', 'transfer-encoding': 'chunked', 'connection': 'close', 'x-amz-request-id': 'REQ_ID', 'date': 'Fri, 12 May 2017 21:21:47 GMT', 'content-type': 'application/xml'}}}]
>>>

答案 1 :(得分:3)

  

删除文件夹内容的灵活(超过1000个文件)成语是什么?

没有。

S3中的主要资源是存储桶中的对象(由密钥标识)。

文件夹不是资源,不是容器 -  它们是由于在对象键中存在/分隔符而为方便起见而创建的虚构构造。 ("空"文件夹,例如可以由控制台创建的文件夹只是一个零字节对象,其键以/结尾。)

因此,"删除文件夹及其所有内容没有成语。甚至在控制台中完成此操作的能力也是通过向API发送删除或多对象删除请求(限制为1000)。

生命周期策略也可用于删除具有给定键前缀的所有对象。它具有以天为单位的时间粒度,并且对象在创建后的指定天数内被删除,+ 1 / -0天(它们可能持续时间基本上比自策略以来指定的实际时间长23:59:59每天只评估一次 - 而不是实时评估。

答案 2 :(得分:0)

您可以使用aws cli:https://aws.amazon.com/cli/和一些Unix命令来完成此操作。

此aws cli命令应该起作用:

aws s3 rm s3://<your_bucket_name> --recursive --exclude "*" --include "<your_regex>"

如果要包含子文件夹,则应添加标志-递归

或使用Unix命令:

aws s3 ls s3://<your_bucket_name>/ | awk '{print $4}' | xargs -I%  <your_os_shell>   -c 'aws s3 rm s3:// <your_bucket_name>  /% $1'

说明:

  1. 列出存储桶中的所有文件-管道->
  2. 获取第四个参数(其文件名)-pipe-> //您可以将其替换为linux命令以匹配您的模式
  3. 使用aws cli运行删除脚本