本页面讨论 Cloud Storage 中的文件夹,以及这些文件夹在 Cloud Storage 工具之间有何不同。
概览
Cloud Storage 使用平面命名空间运行,这意味着文件夹实际上不会存在于 Cloud Storage 中。如果您在存储桶 your-bucket
中创建名为 folder1/file.txt
的对象,则该对象的路径为 your-bucket/folder1/file.txt
,但没有名为 folder1
的文件夹;字符串 folder1
是对象名称的一部分。
但是,Google Cloud 控制台和 Cloud Storage CLI 可以提供分层文件树的幻觉:
Google Cloud 控制台会以类似于本地文件浏览器的文件夹创建可视化的表示形式。
Cloud Storage CLI 使用各种规则模拟典型的命令行目录体验。
工具
点击下面的标签,了解各个工具如何处理文件夹。
控制台
在 Google Cloud 控制台中,您可以在存储桶中创建一个空文件夹,也可以上传现有文件夹。
当您上传现有文件夹时,该文件夹的名称将成为文件夹中所有对象的路径的一部分。所有子文件夹及其包含的对象也会包含在上传内容中。
要创建文件夹,请执行以下操作:
- 在 Google Cloud 控制台中,进入 Cloud Storage 存储桶页面。
导航到存储桶。
点击创建文件夹以创建空的新文件夹,或点击上传文件夹来上传现有文件夹。
命令行
为了实现错开分层文件树的视觉效果,gcloud storage
和 gsutil
命令会应用以下规则来确定应将命令中的目标网址视为对象名称还是文件夹:
如果目标网址以
/
字符结尾,则 CLI 命令会将目标网址视为文件夹。例如,假设存在以下命令,其中your-file
是文件的名称:gcloud storage cp your-file gs://your-bucket/abc/
完成此命令后,Cloud Storage 会在存储桶
your-bucket
中创建一个名为abc/your-file
的对象。如果您将多个源文件复制到目标网址,则 CLI 会将目标网址视为文件夹。例如,假设存在以下命令,其中
your-dir
是包含file1
和file2
等文件的文件夹:gcloud storage cp your-dir gs://your-bucket/abc --recursive
完成此命令后,Cloud Storage 会在存储桶
your-bucket
中创建对象abc/your-dir/file1
和abc/your-dir/file2
。如果上述规则均不适用,CLI 会检查存储桶中的对象,以确定目标网址是对象名称还是文件夹。例如,假设存在以下命令,其中
your-file
是文件的名称:gcloud storage cp your-file gs://your-bucket/abc
CLI 会使用
/
分隔符和前缀=abc
针对your-bucket
发出对象列出请求,以确定your-bucket
中是否有路径以abc/
开头的对象。如果有,CLI 会将abc/
视为文件夹名称,并且上述命令会在存储桶your-bucket
中创建对象abc/your-file
。否则,CLI 会在your-bucket
中创建对象abc
。
这种基于规则的方法与许多工具的工作方式不同,后者会创建 0 字节对象来标记文件夹的存在。Cloud Storage CLI 可以理解此类工具采用的多种惯例(例如将 _$folder$
添加到 0 字节对象名称末尾的惯例),但不要求此类标记对象实现与 UNIX 命令一致的命名行为。
重试和命名
当 Cloud Storage CLI 重试中断的请求时,您可能会遇到以下问题:第一次尝试复制文件子集,而后续尝试遇到已存在的目标文件夹,这会导致对象命名不正确。
例如,假设存在以下命令,其中 your-dir/
下存在子文件夹(如 dir1
和 dir2
),这两个子文件夹都包含文件 abc
:
gcloud storage cp ./your-dir gs://your-bucket/new --recursive
如果路径 gs://your-bucket/new
尚不存在,则 CLI 会在第一次尝试成功时创建以下对象:
new/dir1/abc new/dir2/abc
但是,下次成功尝试同一命令时,CLI 会创建以下对象:
new/your-dir/dir1/abc new/your-dir/dir2/abc
如需让 CLI 在每次尝试时保持一致性,请尝试以下操作:
在目标网址的末尾添加斜杠,以便 CLI 始终将其视为文件夹。
请使用
gcloud storage rsync
或gsutil rsync
。由于rsync
不使用 Unix cp 定义的文件夹命名规则,因此无论目标子文件夹是否存在,它都会以一致的方式运行。
如需详细了解如何构建名称,请参阅使用 cp
构建名称。
补充说明
您无法使用 Cloud Storage CLI 创建零字节对象来模拟空文件夹。
如果您使用脚本通过组合子路径来构建文件路径,请注意,由于
/
只是位于对象名称中的字符,因此 CLI 将gs://my-bucket/folder/
解释为与gs://my-bucket//folder
不同的对象。
REST API
JSON API
JSON API 中不存在文件夹,但您可以使用prefix
和delimiter
查询参数缩小列出的对象。
例如,如需列出存储桶 my-bucket
中前缀为 folder/subfolder/
的所有对象,请使用以下网址发出对象列出请求:
"https://storage.googleapis.com/storage/v1/b/my-bucket/o?prefix=folder/subfolder/"
XML API
XML API 中不存在文件夹,但您可以使用prefix
和delimiter
查询参数缩小搜索范围列出的对象。
例如,如需列出存储桶 my-bucket
中前缀为 folder/subfolder/
的所有对象,请使用以下网址发出对象列出请求:
"https://storage.googleapis.com/my-bucket?prefix=folder/subfolder/"