删除s3桶文件夹中的文件



我有一个脚本来删除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个文件:

  1. 猫/siberian.png
  2. 狗/akita.png
  3. 狗/poodle.png

此时,S3中将有3个对象。您看起来有两个文件夹(cats/dogs/),但实际上并没有这些文件夹。如果你删除了这3个对象,那么你将没有对象(也没有文件夹)。您认为您拥有的文件夹实际上并不存在-它们是从具有以cats/dogs/开头的键的对象的存在推断出来的。

如果您再次使用空S3桶开始,但这次您使用AWS S3控制台创建文件夹cats/dogs/,然后上传上面列出的相同的三个文件,此时您将有5个对象:

  1. /
  2. 猫/siberian.png
  3. /
  4. 狗/akita.png
  5. 狗/poodle.png

你有5个对象,其中2个代表文件夹,3个代表文件。您有5个对象而不是3个对象的原因是,当您要求S3控制台创建2个文件夹时,它实际上创建了2个显示为文件夹的对象。如果你现在删除3个PNG对象,你将仍然有2个剩余的对象:

  1. /
  2. /

也就是说,你将看起来剩下两个文件夹。

注意,此时您可以使用S3控制台(或awscli或任何SDK)删除这2个"文件夹"对象。它们只是对象(尽管它们的大小为零,看起来像文件夹,因为它们的键以/结尾),并且可以像删除常规S3对象一样删除。

首先要意识到的是文件夹实际上并不存在于Amazon S3中。. 根据你的例子,一个对象可以上传到s3://bucket/subfolder3/foo.txt,subfolder3文件夹将神奇地"出现"。当该对象被删除时,文件夹将"消失"(因为它实际上从未存在过)。

使用S3最好的方法是简单的,不用担心文件夹. 提供它们只是作为将对象分组到前缀的一种方式。

当用户在S3管理控制台中单击创建文件夹时按钮,零长度对象以与文件夹相同的名称创建。这将强制文件夹"出现"在S3中,即使路径中没有对象。零长度对象实际上是文件夹。这就是为什么你在代码中收到不同的结果。

如果您想保留手工创建的文件夹,不要删除零长度对象他们的名字后面有一个斜杠。这将保留那些文件夹的外观。

在您的例子中,subfolder3总是消失,因为没有创建零长度的对象。所以,要么创建一个文件夹,要么直接创建不要担心文件夹因为它们实际上在S3中没有特定的用途。

最新更新