如何按名称删除 S3 存储桶中的旧文件?

8

S3桶/管理/生命周期使用前缀类似,我想要删除一些旧文件,这些文件包含特定的单词。

我希望删除那些以Screenshot开头或文件名中包含screencast且创建日期超过365天的文件。

示例

  • /Screenshot 2017-03-19 10.11.12.png
  • folder1/Screenshot 2019-03-01 14.31.55.png
  • folder2/sub_folder/project-screencast.mp4

我目前正在测试生命周期前缀是否也适用于文件。

2个回答

3

您可以编写一个程序来完成这个任务,比如这个Python脚本:

import boto3

s3 = boto3.client('s3', region_name='ap-southeast-2')
response = s3.list_objects_v2(Bucket='my-bucket')

keys_to_delete = [{'Key': object['Key']} 
                  for object in response['Contents'] 
                  if object['LastModified'] < datetime(2018, 3, 20)
                     and ('Screenshot' in object['Key'] or 'screencast' in object['Key'])
                 ]

s3.delete_objects(Bucket='my-bucket', Delete={'Objects': keys_to_delete})

你可以将其修改为“1年前”,而不是具体日期。

1
太好了,这非常有帮助... 在list_objects调用中添加一个前缀将非常有帮助,如果您想从特定的子文件夹中删除。 响应= s3.list_objects_v2({"Bucket":'my-bucket',"Prefix":"path/to/subfolder/" }) - ronit

1

我不相信你可以使用通配符(如*screencast*)应用生命周期规则,只能使用前缀(如“taxes/”或“taxes/2010”)。

针对您的情况,我可能会编写一个脚本(或者可能是Athena查询),过滤S3 Inventory报告中与您的名称/年龄条件匹配的文件,然后将它们删除。

当然,您可以像@John Rotenstein建议的那样编写程序来执行此操作。唯一不理想的情况是如果您有数百万或数十亿个对象,因为枚举对象列表所需的时间将是显着的。但是对于合理数量的对象来说,这是可以接受的。


那么,前缀“taxes/2010”会删除/过期名为“taxes/2010-10-02.txt”的文件,因为该文件以“2010”开头? - Chance Smith
是的,但是因为完整的键以taxes/2010开头,而不是仅仅因为文件名以2010开头。我还没有测试过,但它应该是这样工作的:任何以所述前缀开头的内容。 - jarmod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接