文件夹不会在Amazon S3上删除

时间:2012-03-23 05:05:53

标签: amazon-s3 amazon-web-services amazon-emr

我正在尝试删除由于MapReduce作业而创建的文件夹。存储桶中的其他文件删除就好了,但此文件夹不会删除。当我尝试从控制台删除它时,其状态旁边的进度条保持为0.已多次尝试,包括在其间注销/登录。

5 个答案:

答案 0 :(得分:16)

我遇到了同样的问题,并使用AWS CLI修复它:

aws s3 rm s3://<your-bucket>/<your-folder-to-delete>/ --recursive ;

(假设您已经运行aws configure并且aws s3 ls s3://<your-bucket>/已经运行)

答案 1 :(得分:5)

首先,Amazon S3实际上没有文件夹/目录的原生概念,而是仅由存储桶和对象/键组成的平面存储架构 - 在大多数S3工具中看到的目录样式表示(包括AWS Management Console本身)仅基于约定,即模拟具有相同前缀的对象的层次结构 - 有关此体系结构的更多详细信息,请参阅我对How to specify an object expiration prefix that doesn't match the directory?的回答,包括来自AWS文档的引用/引用

因此,您的问题可能源于使用不同约定来模拟此层次结构的工具,请参阅AWS论坛中的以下答案:

  • Ivan Moiseev对相关问题Cannot delete file from bucket的回答,他建议使用其他工具检查您是否有这样的问题,并据此予以纠正。

  • AWS团队对What are these _$folder$ objects的回复? - 这是许多工具使用的约定,包括Hadoop在S3中创建目录。它们主要用于指定空目录。人们可能更喜欢更美观的方案,但这就是这些工具的方式。

祝你好运!

答案 2 :(得分:1)

当我尝试删除存储桶时,我收到以下错误,该存储桶是一个从Cloudfront保存日志文件的目录。

An unexpected error has occurred. Please try again later.

在Cloudfront中禁用日志记录后,我能够成功删除该文件夹。

我的猜测是,它是Cloudfront使用的系统文件夹,不允许所有者删除。

在您的情况下,您可能想要检查MapReduce是否持有相关文件夹。

答案 3 :(得分:1)

我遇到了同样的问题。尝试了许多登录,注销尝试和刷新但问题仍然存在。搜索了stackoverflow并找到了在不同文件夹中剪切和粘贴文件夹然后删除但没有工作的建议。 您应该看的另一件事是版本控制可能会影响您的存储桶可能暂停版本控制,允许您删除该文件夹。

我的解决方案是用代码删除它。我在python中使用了boto包来处理s3上的文件,当我试图从我的python代码中删除该文件夹时,删除工作正常。

import boto
from boto.s3.key import Key
keyId = "your_aws_access_key"
sKeyId = "your_aws_secret_key"
fileKey="dummy/foldertodelete/" #Name of the file to be deleted
bucketName="mybucket001" #Name of the bucket, where the file resides
conn = boto.connect_s3(keyId,sKeyId) #Connect to S3
bucket = conn.get_bucket(bucketName) #Get the bucket object
k = Key(bucket,fileKey) #Get the key of the given object
k.delete() #Delete

S3没有保留目录,它只是一个扁平的文件结构,所以一切都是用密钥管理的。 对于你来说它是一个文件夹,但对于S3它只是一个键。

如果要删除名为 - &gt;的文件夹。假 那么关键就是

fileKey = "/dummy/"

答案 4 :(得分:0)

首先,从getBucket方法读取目录内容,然后获得所有文件的数组列表,然后从deleteObject方法中删除该文件。

 if (($contents = $this->S3->getBucket(AS_S3_BUCKET, "file_path")) !== false) 
 {
     foreach ($contents as $file) 
     {
     $result = $this->S3->deleteObject(AS_S3_BUCKET,$file['name']);
     }
 }

$this->S3是S3类对象,AS_S3_BUCKET是存储桶名称。