Amazon S3上的文件夹无法删除

13

我正在尝试删除一个由MapReduce作业创建的文件夹。存储桶中的其他文件可以轻松删除,但是这个文件夹无法删除。当我尝试从控制台删除它时,其状态旁边的进度条仍然停留在0。已经进行了多次尝试,包括在注销/登录之间。


该文件夹是来自Elastic MapReduce作业还是其他MapReduce框架? - Steffen Opel
5个回答

18

我曾遇到同样的问题,使用 AWS CLI 进行修复:

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

(这假定您已经运行了 aws configureaws s3 ls s3://<your-bucket>/ 命令已经可以正常工作)


@YuAnShaolinMaculelêLai 在PowerShell或Bash中,分号“;”是可选的。我承认,我们已经进入了一个半分号时代的后现代时代(Ruby/Python)...但它有其用途:允许在单行上执行多个命令,或表示语句的结束。 - sonjz
@sonjz 我明白了。谢谢你。 - YuAn Shaolin Maculelê Lai
1
+1 - 当我创建了一个名为folder:(注意末尾的冒号)的无效名称文件夹时,这对我非常有效,因为我无法使用Cyberduck删除它。 - Cyclonecode
这对我没起作用。我正在检查为什么它不能工作。 - Niklas Rosencrantz
1
@NiklasRosencrantz 我猜测你的 IAM 权限,或者你需要指定 --region--profileaws s3 ls --region us-east-1 --profile default 是一个很好的测试,可以检查你是否能够连接(假设你已经运行了 aws configure 并且在 AWS 上设置了你的权限)。 - sonjz
显示剩余2条评论

5
首先,Amazon S3 实际上没有本地文件夹/目录的概念,而是由存储桶和对象/键组成的扁平存储架构 - 在 S3 中看到的目录样式呈现(包括 AWS 管理控制台 本身)仅基于惯例,即使用相同前缀模拟对象的层次结构 - 有关此架构的更多详细信息,请参见我对 如何指定不与目录匹配的对象过期前缀? 的回答,其中包括来自 AWS 文档的引用/参考。

因此,你的问题可能源于使用不同惯例模拟此层次结构的工具,例如 AWS 论坛中的以下答案:

  • Ivan Moiseev建议使用其他工具检查是否存在文件删除问题并相应解决,他在相关问题Cannot delete file from bucket的答案中提到。

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

祝好运!


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来说,它只是一个键。

如果您想删除名为 -> dummy 的文件夹, 那么键将是

fileKey = "/dummy/"

1
当我尝试删除一个包含Cloudfront日志文件的目录时,出现了以下错误。
An unexpected error has occurred. Please try again later.

在我禁用了Cloudfront的日志记录后,我成功地删除了该文件夹。

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

在你的情况下,你可能需要检查MapReduce是否占用了相关文件夹。


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 是存储桶名称。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接