使用 boto 从 s3 中删除目录
Using boto to remove a directory from s3
我有以下代码尝试从 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 一起使用,但无法弄明白
目录实际上并不存在于 Amazon S3 中。
Amazon S3 是对象存储,而不是文件系统。所有对象都存储在平面结构中,但文件名 ('Key') 可以包含斜线以充当目录。
因此,s3://my-bucket/foo/bar.txt
不在 foo
目录中。相反,密钥是 foo/bar.txt
.
这有一个有趣的 属性,您可以在不存在的目录中将文件添加到 S3,然后神奇地 'appear' 创建目录:
aws s3 cp foo s3://my-bucket/dir1/dir2/foo
删除该对象会使目录也神奇地消失,因为它们实际上并不存在。
然而,这又提出了一个问题,即当用户单击 创建文件夹 按钮时,AWS 管理控制台中的目录是如何 'created' 的?答案是控制台创建了一个零长度对象 'hold the place' 并使目录看起来在那里:
$ 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)
我有以下代码尝试从 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 一起使用,但无法弄明白
目录实际上并不存在于 Amazon S3 中。
Amazon S3 是对象存储,而不是文件系统。所有对象都存储在平面结构中,但文件名 ('Key') 可以包含斜线以充当目录。
因此,s3://my-bucket/foo/bar.txt
不在 foo
目录中。相反,密钥是 foo/bar.txt
.
这有一个有趣的 属性,您可以在不存在的目录中将文件添加到 S3,然后神奇地 'appear' 创建目录:
aws s3 cp foo s3://my-bucket/dir1/dir2/foo
删除该对象会使目录也神奇地消失,因为它们实际上并不存在。
然而,这又提出了一个问题,即当用户单击 创建文件夹 按钮时,AWS 管理控制台中的目录是如何 'created' 的?答案是控制台创建了一个零长度对象 'hold the place' 并使目录看起来在那里:
$ 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)