【问题标题】:Folder won't delete on Amazon S3文件夹不会在 Amazon S3 上删除
【发布时间】:2012-04-07 17:31:34
【问题描述】:

我正在尝试删除因 MapReduce 作业而创建的文件夹。桶中的其他文件删除就好了,但是这个文件夹不会删除。当我尝试从控制台中删除它时,其状态旁边的进度条仅停留在 0。已进行了多次尝试,包括之间的注销/登录。

【问题讨论】:

  • 文件夹是来自Elastic MapReduce 作业还是来自另一个 MapReduce 框架?

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


【解决方案1】:

我遇到了同样的问题并使用 AWS CLI 解决了它:

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

(假设您已经运行 aws configure 并且 aws s3 ls s3://&lt;your-bucket&gt;/ 已经运行)

【讨论】:

  • 像魅力一样工作,绝对是要走的路。而对于任何好奇的人,如果你想上传一个本地目录,相反的命令是aws s3 cp YourLocalProjectFolder s3://yourS3bucketname --recursive --debug
  • 没有';'在行尾。 aws&gt; s3 rm s3://&lt;your-bucket&gt;/&lt;your-folder-to-delete&gt;/ --recursive
  • @YuAnShaolinMaculelêLai ';'在 powershell 或 bash 中是可选的。我承认,我们已经进入了半冒号(ruby/python)的后现代时代……但它有它的用途:允许在一行中使用多个命令,或者表示语句的结尾。
  • +1 - 当我创建了一个无效名称 folder: 的文件夹(注意尾随冒号)我无法使用cyberduck删除时,这对我来说很好。
  • @NiklasRosencratz 我猜你的 IAM 权限,或者你的 --region 或 --profile 需要指定。 aws s3 ls --region us-east-1 --profile default 是一个很好的测试,看看你是否可以连接(假设你已经运行 aws configure 已经设置了你在 AWS 的任何权限)
【解决方案2】:

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

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

  • Ivan Moiseev 对相关问题Cannot delete file from bucket 的回答,他建议使用其他工具检查您是否可能遇到此类问题并进行相应的补救。

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

祝你好运!

【讨论】:

    【解决方案3】:

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

    An unexpected error has occurred. Please try again later.
    

    在我禁用 Cloudfront 登录后,我能够成功删除该文件夹。

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

    在您的情况下,您可能需要检查 MapReduce 是否保留了相关文件夹。

    【讨论】:

      【解决方案4】:

      我也遇到了同样的问题。尝试了许多登录、注销尝试和刷新,但问题仍然存在。搜索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/"
      

      【讨论】:

        【解决方案5】:

        首先从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-&gt;S3 是 S3 类对象,AS_S3_BUCKET 是存储桶名称。

        【讨论】:

          猜你喜欢
          • 2018-11-09
          • 2012-07-10
          • 1970-01-01
          • 1970-01-01
          • 2016-01-06
          • 2012-03-28
          • 2020-04-24
          • 1970-01-01
          • 2013-07-26
          相关资源
          最近更新 更多