【问题标题】:Rename a folder in GCS using gsutil使用 gsutil 重命名 GCS 中的文件夹
【发布时间】:2019-01-26 09:40:17
【问题描述】:

我无法重命名 GCS 中的现有文件夹。我该怎么做?

根据documentation,应该是:

gsutil mv gs://my_bucket/olddir gs://my_bucket/newdir

然而,olddir 被放在newdir 下,即目录结构是这样的(在调用gsutil mv 之后):

my_bucket
    newdir
        olddir

而不是(我所期望的)

my_bucket
    newdir

我已经尝试了所有是否添加斜杠的所有四种组合,但都没有奏效。

【问题讨论】:

  • 当您运行gsutil 命令并最终得到不需要的嵌套文件夹结构时,它的输出是什么?通常,您会递归地看到 olddir 下包含的所有文件的 Copying... and Removing... 行。
  • 可能重复:stackoverflow.com/questions/45896712/… ...这证实了我的回答 - 虽然我什至提供了解决问题的可行方法,而不是仅仅告诉“不可能”。
  • @yoape:是的,我看到很多“复制 gs://[..]”和“删除 gs://[..]”行。
  • 一般来说,在像 GS 和 AWS S3 这样的对象存储系统中,文件夹不像文件那样是真正的一流项目。 GS 似乎已经修复了这个错误,但是在对象管理中你应该围绕文件而不是文件夹进行设计。

标签: google-cloud-platform google-cloud-storage gsutil


【解决方案1】:

这是 GCS 中已确认的错误,请参阅 https://issuetracker.google.com/issues/112817360

它实际上只发生在newdir 的目录名称是olddir 的子字符串时。因此,问题中的gsutil 调用实际上有效,但以下调用无效:

gsutil mv gs://my-organization-empty-bucket/dir_old gs://my-organization-empty-bucket/dir

【讨论】:

  • 根据问题跟踪器,自 gsutil v4.43 以来已修复此问题。我正在使用 v4.51,它就像一个魅力。
【解决方案2】:

我复制了您的案例,方法是使用一个包含名为 olddir 的文件夹的存储桶,我想将其中的内容移动到 newdir 文件夹。

以下命令:

 gsutils mv gs://<bucketname>/olddir gs://<bucketname>/newdir

将文件夹的全部内容移动到新创建的 newdir 文件夹。

Olddir 和 newdir 文件夹位于同一级别,位于存储桶根目录中。 之后我只需要删除名为 olddir 的文件夹。

桶中的对象不能重命名。

gsutil mv 命令不会像 mv 命令在 Unix CLI 中那样删除先前的文件夹对象。

我猜如果你尝试使用不同位置的“/”字符多次移动文件夹,在发出初始命令后,文件夹的结构和层次结构会发生变化。

请从头开始重试。

请记住,一旦文件夹中有子文件夹,就必须使用完整路径逐个移动对象。

【讨论】:

  • 我仔细检查了所有内容(在一个新的空存储桶中,带有新的文件夹/文件),但我仍然看到错误的行为。这很奇怪,似乎不是使用问题,而是 GCS 中的一个错误。
  • pastebin.com/iksntwwE 如果您对我使用的实际命令感兴趣。
  • 这是因为在您的情况下,当您运行 mv 命令时文件夹 gs://my-organization-empty-bucket/test_data 已经存在,因此它会将 data_b 文件夹复制到名为 test_data 的文件夹中。如果目标 test_data 文件夹不存在,它将创建它并将 data_b 文件夹的内容移动到 test_data 文件夹中。
  • 根据脚本输出:gs://my-organization-empty-bucket/test_data/text.txt $ gsutil rm -r gs://my-organization-empty-bucket/test_data 删除gs://my-organization-empty-bucket/test_data/text.txt#1534770322877415... / [1 个对象] 操作已完成超过 1 个对象。文件夹内的文件被删除,但文件夹本身没有被删除。当我在我这边复制时,我已经完成了对 2 个对象的操作,即文件和文件夹。
  • GCS中不存在文件夹的概念。当最后一个文件被删除时,它也会删除该文件夹。另外,我在文件夹上调用rm -r。除此之外,如果我之前没有创建目录,也会发生错误。显然,如果新目录名是旧目录名的子字符串就足够了...
猜你喜欢
  • 2019-07-15
  • 2014-09-05
  • 2018-08-21
  • 2014-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-30
相关资源
最近更新 更多