谷歌 GSutil 创建文件夹

Posted

技术标签:

【中文标题】谷歌 GSutil 创建文件夹【英文标题】:Google GSutil create folder 【发布时间】:2019-01-24 07:35:57 【问题描述】:

如何使用 gsutil 命令在谷歌云存储的存储桶内创建新文件夹?

我尝试在创建存储桶时使用相同的命令,但仍然出现错误

gsutil mb -l us-east1 gs://my-awesome-bucket/new_folder/

谢谢!

【问题讨论】:

【参考方案1】:

目录的概念在 Google Cloud Storage 中是抽象的。来自文档 (How Subdirectories Work):

gsutil 在 Google Cloud Storage 服务支持的“平面”名称空间之上提供了分层文件树的错觉。对于服务而言,对象 gs://your-bucket/abc/def.txt 只是一个名称中恰好包含“/”字符的对象。没有“abc”目录;只是一个具有给定名称的对象。

因此您不能像在传统文件系统中那样“创建”目录。

【讨论】:

【参考方案2】:

如果您清楚存储桶中已存在哪些文件夹和对象,则可以通过将对象复制到文件夹中来使用 gsutil 创建一个新的“文件夹”。

>mkdir test
>touch test/file1
>gsutil cp -r test gs://my-bucket
Copying file://test\file1 [Content- 
Type=application/octet-stream]...
/ [1 files][    0.0 B/    0.0 B]
Operation completed over 1 objects.

>gsutil ls gs://my-bucket
gs://my-bucket/test/

>gsutil ls gs://my-bucket/test
gs://my-bucket/test/file1

如果本地目录为空,它将不起作用。

更简单:

>touch file2
>gsutil cp file2 gs://my-bucket/new-folder/
Copying file://test\file2 [Content- ...

>gsutil ls gs://my-bucket/new-folder
gs://my-bucket/new-folder/file2

注意Surprising Destination Subdirectory Naming 的潜力。例如。如果目标目录已经作为对象存在。对于自动化流程,更稳健的方法是使用rsync。

我不知道是否可以使用 gsutil 创建一个空文件夹。为此,请使用控制台的 创建文件夹 按钮。

【讨论】:

【参考方案3】:

您不能使用 gsutil 创建文件夹,因为 gsutil 不支持它(解决方法见下文)。

但是,它通过以下方式得到支持:

浏览器中的用户界面 编写您自己的 GCS 客户端(我们已经编写了可以创建文件夹的自定义客户端)

因此,即使如另一个答案正确指出的那样,Google 具有平面名称空间结构,它仍然有可能将单个文件夹创建为单个对象。不幸的是,gsutil 没有公开这一点。

(丑陋的)gsutil 解决方法:将虚拟文件添加到文件夹中并上传该虚拟文件 - 但是一旦删除此文件,该文件夹就会消失,除非该文件夹中存在其他文件.

【讨论】:

【参考方案4】:

复制自 Google 云帮助:

将对象复制到存储桶中的文件夹 使用 gsutil cp 命令创建一个文件夹并将图像复制到其中:

gsutil cp gs://my-awesome-bucket/kitten.png gs://my-awesome-bucket/just-a-folder/kitten3.png

这行得通。

【讨论】:

以上是关于谷歌 GSutil 创建文件夹的主要内容,如果未能解决你的问题,请参考以下文章

gsutil 是不是支持使用服务帐户信息创建 boto 文件?

gsutil cp 失败 - “无法创建清单文件”

gsutil cp 创建嵌套目录

gsutil api 谷歌存储近线

将数据从谷歌数据存储复制到 CSV

如何在 gsutil 中创建一个存储桶,用于在 cloudsql 中上传 sql 转储文件。?