本页面介绍了如何复制、重命名和移动对象。虽然有些工具会执行原子对象移动操作,但其他工具会通过将对象复制到新的指定位置,然后删除原始对象来模拟对象移动操作。
- 如需了解有关复制对象的说明,请参阅复制对象。
- 如需了解如何通过复制对象来移动或重命名对象,请参阅通过复制来移动或重命名对象。
- 如需了解如何以原子方式重命名对象,请参阅以原子方式重命名对象。
我们建议使用 Storage Transfer Service 在存储桶之间移动超过 1 TB 的数据。
准备工作
如需复制、重命名或移动对象,您必须获得所需的 IAM 角色。以下部分介绍了不同用例的 IAM 要求。
复制对象(包括通过复制来移动或重命名对象)
如需获得复制对象所需的权限,请让管理员在包含要移动的对象的源存储桶或要将对象移动到的目标存储桶中为您授予以下 IAM 角色:
-
源存储桶上的 Storage Object Viewer (
roles/storage.objectViewer
) - 目标存储桶上的 Storage Object User (
roles/storage.objectUser
) -
如需使用 Google Cloud 控制台复制对象,您需要拥有以下角色:
源存储桶和目标存储桶的 Viewer 基本角色 (
roles/viewer
),以及roles/storage.objectViewer
和roles/storage.objectUser
这些预定义角色包含复制对象所需的权限。如需查看所需的确切权限,请展开所需权限部分:
所需权限
您需要具备以下权限才能复制对象:
- 针对源存储桶的
storage.objects.get
- 针对目标存储桶的
storage.objects.create
-
针对目标存储桶的
storage.objects.delete
(仅当您在对象复制或移动操作过程中替换或覆盖目标存储桶中的对象时才需要) -
针对源存储桶的
storage.objects.delete
(仅当您使用基础复制和删除操作移动对象时才需要) -
针对目标存储桶的
storage.folders.create
(仅当您要移动的对象位于您要在目标存储桶中创建的文件夹中时才需要) -
针对源存储桶和目标存储桶的
storage.objects.list
(仅当您使用 Google Cloud 控制台复制、移动或重命名对象时才需要) -
针对包含源存储桶和目标存储桶的项目的
storage.buckets.list
(仅当您使用 Google Cloud 控制台复制、移动或重命名对象时需要)
您还可以通过自定义角色获得这些权限。
如需了解如何授予存储桶的角色,请参阅将 IAM 与存储桶搭配使用。如需了解如何授予项目的角色,请参阅管理对项目的访问权限。
如果您要复制的对象启用了某些功能,则可能需要其他角色或替代角色。例如,如果您要复制的对象具有您要保留的对象保留配置,则您需要对目标存储桶具有可提供 storage.objects.setRetention
权限的角色,例如 Storage Object Admin (roles/storage.objectAdmin
) 角色。如需了解详情,请参阅适用于 Cloud Storage 的 IAM 权限。
以原子方式重命名对象
如需获得以原子方式重命名对象所需的权限,请让您的管理员为您授予包含待重命名对象的存储桶的 Storage Object User (roles/storage.objectUser
) IAM 角色。
此预定义角色包含以原子方式重命名对象所需的权限。如需查看所需的确切权限,请展开所需权限部分:
所需权限
如需以原子方式重命名对象,您需要具备以下权限:
-
storage.objects.move
-
storage.objects.create
-
storage.objects.delete
(仅当您要覆盖或替换对象时才需要)
您还可以通过自定义角色获得这些权限。
如需了解如何授予存储桶的角色,请参阅将 IAM 与存储桶搭配使用。
复制对象
本部分介绍了如何复制对象。您可以将对象从一个存储桶复制到另一个存储桶。
控制台
- 在 Google Cloud 控制台中,转到 Cloud Storage 存储桶页面。
在存储桶列表中,找到包含要复制的对象的存储桶,并点击其名称。
此时会打开“存储桶详情”页面,其中“对象”标签页已选中。
导航到可能位于文件夹中的对象。
点击与对象关联的对象溢出菜单 (more_vert)。
点击复制。
此时系统会显示复制对象窗格。
在目的地字段中,输入目的地存储桶的名称和复制的对象的名称。
您也可以点击浏览来选择目标,但浏览选项仅限于当前项目中的存储桶。
点击复制。
如需了解如何在 Google Cloud 控制台中获取失败的 Cloud Storage 操作的详细错误信息,请参阅问题排查。
命令行
使用 gcloud storage cp
命令:
gcloud storage cp gs://SOURCE_BUCKET_NAME/SOURCE_OBJECT_NAME gs://DESTINATION_BUCKET_NAME/NAME_OF_COPY
其中:
SOURCE_BUCKET_NAME
是包含待复制对象的存储桶的名称。例如my-bucket
。SOURCE_OBJECT_NAME
是您要复制的对象的名称。例如pets/dog.png
。DESTINATION_BUCKET_NAME
是对象要复制到的存储桶的名称。例如another-bucket
。NAME_OF_COPY
是您要为对象副本指定的名称。例如shiba.png
。
如果成功,响应类似于以下示例:
Copying gs://example-bucket/file.txt to gs://other-bucket/file-copy.txt Completed files 1/1 | 164.3kiB/164.3kiB
客户端库
C++
如需了解详情,请参阅 Cloud Storage C++ API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
C#
如需了解详情,请参阅 Cloud Storage C# API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
Go
如需了解详情,请参阅 Cloud Storage Go API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
Java
如需了解详情,请参阅 Cloud Storage Java API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
Node.js
如需了解详情,请参阅 Cloud Storage Node.js API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
PHP
如需了解详情,请参阅 Cloud Storage PHP API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
Python
如需了解详情,请参阅 Cloud Storage Python API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
Ruby
如需了解详情,请参阅 Cloud Storage Ruby API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
REST API
JSON API
安装并初始化 gcloud CLI,以便为
Authorization
标头生成访问令牌。使用
cURL
,通过POST
Object 请求调用 JSON API:curl -X POST \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "Content-Length: 0" \ "https://storage.googleapis.com/storage/v1/b/SOURCE_BUCKET_NAME/o/SOURCE_OBJECT_NAME/rewriteTo/b/DESTINATION_BUCKET_NAME/o/NAME_OF_COPY"
其中:
SOURCE_BUCKET_NAME
是包含待复制对象的存储桶的名称。例如my-bucket
。SOURCE_OBJECT_NAME
是要复制的对象的网址编码名称。例如,pets/dog.png
的网址编码为pets%2Fdog.png
。DESTINATION_BUCKET_NAME
是对象要复制到的存储桶的名称。例如another-bucket
。NAME_OF_COPY
是您要为对象副本指定的网址编码名称。例如shiba.png
。
由于
rewrite
方法通过有限大小的数据块复制数据,因此您的副本可能需要多个请求,尤其是对于大型对象。例如,对
rewrite
请求的以下响应表明您需要发出额外的rewrite
请求:{ "kind": "storage#rewriteResponse", "totalBytesRewritten": 1048576, "objectSize": 10000000000, "done": false, "rewriteToken": TOKEN_VALUE }
在后续请求中使用
rewriteToken
继续复制数据:curl -X POST \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "Content-Length: 0" \ -d '{"rewriteToken": "TOKEN_VALUE"}' \ "https://storage.googleapis.com/storage/v1/b/SOURCE_BUCKET_NAME/o/SOURCE_OBJECT_NAME/rewriteTo/b/DESTINATION_BUCKET_NAME/o/NAME_OF_COPY"
其中:
TOKEN_VALUE
是上一个请求中返回的rewriteToken
值。- 所有其他值均与上一个请求中使用的值相匹配。
完整复制对象后,最后一个响应将包含一个
done
属性(设置为true
),没有rewriteToken
属性,副本的元数据包含在resource
属性中。{ "kind": "storage#rewriteResponse", "totalBytesRewritten": 10000000000, "objectSize": 10000000000, "done": true, "resource": objects Resource }
XML API
安装并初始化 gcloud CLI,以便为
Authorization
标头生成访问令牌。使用
cURL
,通过PUT
Object 请求调用 XML API:curl -X PUT \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "x-goog-copy-source: SOURCE_BUCKET_NAME/SOURCE_OBJECT_NAME" \ "https://storage.googleapis.com/DESTINATION_BUCKET_NAME/NAME_OF_COPY"
其中:
SOURCE_BUCKET_NAME
是包含待复制对象的存储桶的名称。例如my-bucket
。SOURCE_OBJECT_NAME
是您要复制的对象的名称,例如pets/dog.png
。DESTINATION_BUCKET_NAME
是对象要复制到的存储桶的名称。例如another-bucket
。NAME_OF_COPY
是您要为对象副本指定的网址编码名称。例如shiba.png
。
通过复制来移动或重命名对象
本部分介绍了如何使用底层对象复制操作来移动或重命名对象。本部分中介绍的工具通过将原始对象复制到另一个命名空间,然后删除原始对象来执行对象移动和重命名操作。
控制台
- 在 Google Cloud 控制台中,转到 Cloud Storage 存储桶页面。
在存储桶列表中,找到包含要移动的对象的存储桶,并点击其名称。
此时会打开“存储桶详情”页面,其中“对象”标签页已选中。
导航到可能位于文件夹中的对象。
点击与对象关联的对象溢出菜单 (more_vert)。
如果要在同一存储桶中为对象指定一个新名称,请点击重命名。
在出现的叠加窗口中,输入对象的新名称。
点击重命名。
如果要将对象移动到其他存储桶,请点击移动。
在出现的叠加窗口中,点击浏览。
选择对象要移动到的目的地。
点击选择。
点击移动。
如需了解如何在 Google Cloud 控制台中获取失败的 Cloud Storage 操作的详细错误信息,请参阅问题排查。
命令行
使用 gcloud storage mv
命令:
gcloud storage mv gs://SOURCE_BUCKET_NAME/SOURCE_OBJECT_NAME gs://DESTINATION_BUCKET_NAME/DESTINATION_OBJECT_NAME
其中:
SOURCE_BUCKET_NAME
是包含要移动或重命名的对象的存储桶名称。例如my-bucket
。SOURCE_OBJECT_NAME
是要移动或重命名的对象的名称。例如pets/dog.png
。DESTINATION_BUCKET_NAME
是要将对象移动到的存储桶的名称。例如another-bucket
。DESTINATION_OBJECT_NAME
是希望对象在移动或重命名后使用的名称。例如shiba.png
。
如果成功,响应类似于以下示例:
Copying gs://example-bucket/old-file.txt to gs://new-bucket/new-file.txt Removing gs://example-bucket/old-file.txt... Completed files 1/1 | 164.3kiB/164.3kiB
客户端库
C++
如需了解详情,请参阅 Cloud Storage C++ API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
C#
如需了解详情,请参阅 Cloud Storage C# API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
Go
如需了解详情,请参阅 Cloud Storage Go API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
Java
如需了解详情,请参阅 Cloud Storage Java API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
Node.js
如需了解详情,请参阅 Cloud Storage Node.js API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
PHP
如需了解详情,请参阅 Cloud Storage PHP API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
Python
如需了解详情,请参阅 Cloud Storage Python API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
Ruby
如需了解详情,请参阅 Cloud Storage Ruby API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
REST API
以原子方式重命名对象
本部分介绍了如何以原子方式重命名存储桶中的对象。如需重命名对象,您可以使用 Cloud Storage JSON API 中的 Objects: move
方法。
REST API
JSON API
如需以原子方式重命名对象,请执行以下操作:
安装并初始化 gcloud CLI,以便为
Authorization
标头生成访问令牌。使用
cURL
通过Objects: move
请求调用 JSON API:curl -X POST
-H "Authorization: Bearer $(gcloud auth print-access-token)"
-H "Content-Length: 0"
"https://storage.googleapis.com/storage/v1/b/BUCKET_NAME/o/SOURCE_OBJECT_NAME/moveTo/o/DESTINATION_OBJECT_NAME"其中:
BUCKET_NAME
是包含待重命名对象的存储桶的名称。例如my-bucket
。SOURCE_OBJECT_NAME
是要重命名的对象的网址编码名称。例如,pets/dog.png
的网址编码为pets%2Fdog.png
。DESTINATION_OBJECT_NAME
是您要使用的网址编码名称。例如,pets/cat.png
的网址编码为pets%2Fcat.png
。
后续步骤
- 更改对象的存储类别。
- 修改对象的元数据。
- 将对象和存储桶设置为可被公开访问。
- 详细了解对象命名要求。
- 了解如何使用请求前提条件来防止出现竞态条件。