我有一个脚本来删除s3 Bucket和子文件夹中的文件,它不会删除目录。
但是如果这个文件夹是上传的,而不是在s3中自己创建的,它也会删除目录/文件夹。
example : s3 Bucket name : Test
Subfolder1 (created in s3 )
subfolder2 ( created in s3 )
subfolder3( uploaded )
所以当我运行我的脚本,它删除子文件夹3和里面的文件了。我不想删除子文件夹3,只需要删除这些文件夹中的文件。
for obj in bucket.objects.all():
if not obj.key.endswith('/'):
print(obj.key)
s3.Object(bucket.name,obj.key).delete()
您的脚本实际上没有删除任何文件夹。您认为已删除的文件夹从一开始就不存在。
假设您从一个空S3桶开始,并使用以下密钥上传3个文件:
- 猫/siberian.png
- 狗/akita.png
- 狗/poodle.png
此时,S3中将有3个对象。您看起来有两个文件夹(cats/
和dogs/
),但实际上并没有这些文件夹。如果你删除了这3个对象,那么你将没有对象(也没有文件夹)。您认为您拥有的文件夹实际上并不存在-它们是从具有以cats/
和dogs/
开头的键的对象的存在推断出来的。
如果您再次使用空S3桶开始,但这次您使用AWS S3控制台创建文件夹cats/
和dogs/
,然后上传上面列出的相同的三个文件,此时您将有5个对象:
- /
- 猫/siberian.png 狗
- /
- 狗/akita.png
- 狗/poodle.png
你有5个对象,其中2个代表文件夹,3个代表文件。您有5个对象而不是3个对象的原因是,当您要求S3控制台创建2个文件夹时,它实际上创建了2个显示为文件夹的对象。如果你现在删除3个PNG对象,你将仍然有2个剩余的对象:
猫- / 狗
- /
也就是说,你将看起来剩下两个文件夹。
注意,此时您可以使用S3控制台(或awscli或任何SDK)删除这2个"文件夹"对象。它们只是对象(尽管它们的大小为零,看起来像文件夹,因为它们的键以/
结尾),并且可以像删除常规S3对象一样删除。
首先要意识到的是文件夹实际上并不存在于Amazon S3中。. 根据你的例子,一个对象可以上传到s3://bucket/subfolder3/foo.txt
,subfolder3
文件夹将神奇地"出现"。当该对象被删除时,文件夹将"消失"(因为它实际上从未存在过)。
使用S3最好的方法是简单的,不用担心文件夹. 提供它们只是作为将对象分组到前缀的一种方式。
当用户在S3管理控制台中单击创建文件夹时按钮,零长度对象以与文件夹相同的名称创建。这将强制文件夹"出现"在S3中,即使路径中没有对象。零长度对象实际上是文件夹。这就是为什么你在代码中收到不同的结果。
如果您想保留手工创建的文件夹,不要删除零长度对象他们的名字后面有一个斜杠。这将保留那些文件夹的外观。
在您的例子中,subfolder3
将总是消失,因为没有创建零长度的对象。所以,要么创建一个文件夹,要么直接创建不要担心文件夹因为它们实际上在S3中没有特定的用途。