【问题标题】:How can I delete old files by name in S3 bucket?如何按名称删除 S3 存储桶中的旧文件?
【发布时间】:2019-03-20 23:32:46
【问题描述】:

就像在S3-Bucket/Management/Lifecycles using prefixes 中一样,我想删除包含某些单词的旧文件。

我希望删除以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

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

【问题讨论】:

    标签: amazon-web-services amazon-s3


    【解决方案1】:

    你可以写一个程序来做,比如这个 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 年前”而不是特定日期。

    【讨论】:

    • 太好了,帮助很大...可以在 list_objects 调用中添加一个前缀,如果您想从特定的子文件夹中删除,这将很有帮助 response = s3.list_objects_v2({"Bucket ": 'my-bucket', "Prefix": "path/to/subfolder/"})
    【解决方案2】:

    我不认为您可以使用诸如*screencast* 之类的通配符来应用生命周期规则,而只能使用诸如“taxes/”或“taxes/2010”之类的前缀。

    对于您的情况,我可能会编写一个脚本(或者可能是一个 Athena 查询)来过滤 S3 Inventory 报告以查找与您的姓名/年龄条件匹配的文件,然后对其进行修剪。

    当然,您可以按照@John Rotenstein 的建议编写一个程序来执行此操作。可能不理想的一次是如果您有数百万或数十亿个对象,因为枚举对象列表的时间会很长。但是对于合理数量的对象来说就可以了。

    【讨论】:

    • 那么,前缀taxes/2010 会删除/过期一个名为taxes/2010-10-02.txt 的文件,因为该文件以2010 开头?
    • 是的,但是因为完整的密钥以 tax/2010 开头,而不是因为文件名以 2010 开头。我没有对此进行测试,但这就是它应该如何工作的:任何以所述前缀开头的东西。
    猜你喜欢
    • 2018-05-16
    • 2012-04-20
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 2011-02-13
    • 1970-01-01
    • 2012-05-16
    相关资源
    最近更新 更多