【问题标题】:Using boto to remove a directory from s3使用 boto 从 s3 中删除目录
【发布时间】:2017-03-17 07:10:56
【问题描述】:

我有以下代码尝试从 S3 中删除目录:

    s3 = boto.connect_s3(
        aws_access_key_id=settings.AWS_ACCESS_KEY_ID,
        aws_secret_access_key=settings.AWS_SECRET_ACCESS_KEY,
    )
    bucket = s3.lookup(self.bucket_name)
    if not bucket:
        return True

    key = Key(bucket, "test/%s/%s" % (
        self.account_id,
        self.id
    ))

    key.delete()

当代码运行时,它不会失败。但是该目录没有被删除。如果我在目录中添加一个文件,那么它会被删除,而不是目录。

我正在使用 Python 2.7 和 Boto 2,但无法解决这个问题

【问题讨论】:

    标签: python-2.7 amazon-web-services amazon-s3 boto


    【解决方案1】:

    目录实际上并不存在于 Amazon S3 中。

    Amazon S3 是对象存储,而不是文件系统。所有对象都存储在平面结构中,但文件名('Key')可以包含斜杠以充当目录。

    因此,s3://my-bucket/foo/bar.txt 不在foo 目录中。相反,密钥是foo/bar.txt

    这有一个有趣的属性,您可以在不存在的目录中将文件添加到 S3,并且目录神奇地“似乎”被创建:

    aws s3 cp foo s3://my-bucket/dir1/dir2/foo
    

    删除该对象会使目录也神奇地消失,因为它们确实不存在。

    但是,这引发了一个问题,即当用户单击 创建文件夹 按钮时,如何在 AWS 管理控制台中“创建”目录?答案是控制台创建了一个长度为零的对象来“保持位置”并使目录看起来在那里:

    $ aws s3 ls s3://my-bucket/dir
    2017-03-16 22:53:53          0 
    

    下面是一些示例代码,用于删除所有存储桶以及这些存储桶中的对象,其中存储桶名称以 -cheese 结尾。 (请注意,此代码不适用于版本化存储桶。)

    #!/usr/bin/env python
    
    from boto.s3.connection import S3Connection
    
    conn = S3Connection()
    
    buckets = conn.get_all_buckets()
    
    for b in buckets:
      if b.name.endswith("-cheese"):
    
        print "Processing bucket", b.name
        objects = b.list()
        for o in objects:
          print "Deleting object", o.key
          b.delete_key(o.key)
    
        print "Deleting bucket", b.name
        conn.delete_bucket(b.name)
    

    【讨论】:

    • 超级有帮助!谢谢!!那么,如果“目录”中包含单个对象,并且该对象被删除,那么“目录”也将不再存在?
    • 是的。但有时很难看到那个物体。
    猜你喜欢
    • 2014-05-31
    • 2016-12-25
    • 2021-03-22
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 2015-06-04
    相关资源
    最近更新 更多