Cloud Storage 批量递归删除存储对象

作者:MeshCloud脉时云CSM 贾舒悦

一、引言

Cloud Storage 是一项用于将用户的对象存储在 Google Cloud 中的服务。对象是由任意格式的文件组成的不可变的数据段。对象存储在称为存储桶的容器中。所有存储桶都与项目相关联,可以在组织下对项目进行分组。Google Cloud 中的每个项目、存储桶和对象都属于 Google Cloud 资源,Compute Engine 实例等也属于资源。

创建项目后,可以创建 Cloud Storage 存储分区,上传对象至存储分区,以及从存储分区中下载对象。还可以授予权限,使数据可供指定的主帐号访问;或者针对某些用例(例如托管网站),数据可供公共互联网上的所有人访问。

二、整体架构

Cloud Storage 结构应用说明:

  • 组织:公司名为 Example Inc.,创建了一个名为 的 Google Cloud 组织exampleinc.org。
  • 项目:Example Inc. 正在构建多个应用程序,每个应用程序都与一个项目相关联。每个项目都有自己的一组 Cloud Storage API 以及其他资源。
  • Bucket:每个项目可以包含多个桶,这些桶是存储对象的容器。例如,可以photos为应用程序生成的所有图像文件创建一个存储桶和一个单独的videos存储桶。
  • 对象:一个单独的文件,例如名为puppy.png.

三、用户场景

GCS 使用中,用户在 Bucket 下有大批量文件夹,且文件夹下有按日期分类的文件夹和文件,用户有定期删除需求 :

用户问题:GCS路径
gs://prod-datafinger-explore/iceberg/dev/warehouse/datafinger/flash_orderbooklv2 指定目录批量删除

四、准备工作

预置环境:

  • 确认网络环境正常;
  • 确认拥有适当的 IAM 权限;
  • 登陆 Google Cloud Console –> 进入 Cloud Storage –> Google Cloud Shell

环境复现:

创建路径下的相关文件

jiashuyue@cloudshell:~ (qijifei-test)$ gsutil ls gs://prod-datafinger-explore1/iceberg1/**
gs://prod-datafinger-explore1/iceberg1/dev1/warehouse/datafinger/
gs://prod-datafinger-explore1/iceberg1/dev1/warehouse/datafinger/flash_orderbooklv2/

五、删除操作

方法一:gsutil rm 命令删除对象和/或存储桶。例如,以下命令删除对象 flash_orderbooklv2,实践如下:

jiashuyue@cloudshell:~ (qijifei-test)$ gsutil rm gs://prod-datafinger-explore1/iceberg1/dev1/warehouse/datafinger/flash_orderbooklv2/
Removing gs://prod-datafinger-explore1/iceberg1/dev1/warehouse/datafinger/flash_orderbooklv2/...
/ [1 objects]
Operation completed over 1 objects.
jiashuyue@cloudshell:~ (qijifei-test)$ gsutil ls gs://prod-datafinger-explore1/**
gs://prod-datafinger-explore1/iceberg1/dev1/warehouse/datafinger/

方法二:使用 -r 选项指定递归对象删除。例如,以下命令删除
gs://prod-datafinger-explore1/iceberg1/dev1/warehouse/datafinger/ 及其下的所有对象和子目录,实践如下:

jiashuyue@cloudshell:~ (qijifei-test)$ gsutil rm -r gs://prod-datafinger-explore1/iceberg1/dev1/warehouse/datafinger/
Removing gs://prod-datafinger-explore1/iceberg1/dev1/warehouse/datafinger/#1676369523149029...
/ [1 objects]
Operation completed over 1 objects.
jiashuyue@cloudshell:~ (qijifei-test)$ gsutil ls gs://prod-datafinger-explore1/**
gs://prod-datafinger-explore1/iceberg1/dev1/warehouse/

使用启用版本控制的存储桶时,请注意 -r 选项会删除子目录中的所有对象版本。要仅删除子目录中每个对象的实时版本,请使用** 通配符。

方法三:以下命令删除存储桶中所有对象的所有版本,然后删除存储桶,实践如下:

jiashuyue@cloudshell:~ (qijifei-test)$ gsutil rm -r gs://prod-datafinger-explore1/
Removing gs://prod-datafinger-explore1/iceberg1/#1676365891817520...
Removing gs://prod-datafinger-explore1/iceberg1/dev1/#1676365913318713...
Removing gs://prod-datafinger-explore1/iceberg1/dev1/warehouse/#1676369499390201...
/ [3 objects]
Operation completed over 3 objects.
Removing gs://prod-datafinger-explore1/...
jiashuyue@cloudshell:~ (qijifei-test)$ gsutil ls gs://prod-datafinger-explore1/**
BucketNotFoundException: 404 gs://prod-datafinger-explore1 bucket does not exist.
jiashuyue@cloudshell:~ (qijifei-test)$ gsutil ls gs://**
gs://bucket.doge00.com/1.jpg
gs://bucket.doge00.com/j/
gs://dengjun_01/0930/
gs://dengjun_01/0931/
gs://dengjun_01/ods/
gs://gcf-v2-sources-548843172977-us-central1/cbw-dialogflow-test/
gs://shuyue_test01/9.30-:shanghai:zhangtao-test-01.jpg
gs://shuyue_test01/:beijing:zhangtao-test-01.jpg
gs://shuyue_test01/:beijing:zhangtao-test-02.jpg
gs://shuyue_test01/:shanghai:zhangtao-test-01.jpg
gs://shuyue_test01/:shanghai:zhangtao-test-02.jpg
gs://shuyue_test01/9.30/
gs://shuyue_test01/9.31/
gs://shuyue_test01/zhangtao-test/
gs://zhangtao/bitcoin.pdf
gs://zhangtao/index.html
gs://zhangtao/红帽子liunx6.0-s003.vmdk
gs://zhangtao/test/
gs://zhangtao-test/msg.log
gs://zhangtao-test/funplus/
gs://zicheng-test/20220815.txt
gs://zicheng-test/msg.log

Bucket :prod-datafinger-explore1 不存在

方法四:要从存储桶中移除所有对象及其版本而不删除存储桶,请使用以下-a选项,实践如下:

jiashuyue@cloudshell:~ (qijifei-test)$ gsutil ls gs://prod-datafinger-explore1/**
gs://prod-datafinger-explore1/iceberg/
gs://prod-datafinger-explore1/iceberg/dev/
gs://prod-datafinger-explore1/iceberg/dev/warehouse/
gs://prod-datafinger-explore1/iceberg/dev/warehouse/datafinger/
gs://prod-datafinger-explore1/iceberg/dev/warehouse/datafinger/flash_orderbooklv2/
jiashuyue@cloudshell:~ (qijifei-test)$ gsutil rm -a gs://prod-datafinger-explore1/**
Removing gs://prod-datafinger-explore1/iceberg/#1676372148035407...
Removing gs://prod-datafinger-explore1/iceberg/dev/#1676372171846464...
Removing gs://prod-datafinger-explore1/iceberg/dev/warehouse/#1676372195410327...
Removing gs://prod-datafinger-explore1/iceberg/dev/warehouse/datafinger/#1676372212147087...
/ [4 objects]
==> NOTE: You are performing a sequence of gsutil operations that may
run significantly faster if you instead use gsutil -m rm ... Please
see the -m section under "gsutil help options" for further information
about when gsutil -m can be advantageous.

Removing gs://prod-datafinger-explore1/iceberg/dev/warehouse/datafinger/flash_orderbooklv2/#1676372233382789...
/ [5 objects]
Operation completed over 5 objects.
jiashuyue@cloudshell:~ (qijifei-test)$ gsutil ls gs://prod-datafinger-explore1/
jiashuyue@cloudshell:~ (qijifei-test)$

方法五:如果要删除大量对象,请使用gsutil -m启用多线程/多处理的选项,实践如下:

jiashuyue@cloudshell:~ (qijifei-test)$ gsutil ls gs://prod-datafinger-explore1/**
gs://prod-datafinger-explore1/iceberg/dev/warehouse/datafinger/flash_orderbooklv2/
jiashuyue@cloudshell:~ (qijifei-test)$ gsutil -m rm -r gs://prod-datafinger-explore1/iceberg/dev/warehouse/datafinger/
Removing gs://prod-datafinger-explore1/iceberg/dev/warehouse/datafinger/#1676372618773853...
Removing gs://prod-datafinger-explore1/iceberg/dev/warehouse/datafinger/flash_orderbooklv2/#1676372634774226...
/ [2/2 objects] 100% Done
Operation completed over 2 objects.
jiashuyue@cloudshell:~ (qijifei-test)$ gsutil ls gs://prod-datafinger-explore1/**
gs://prod-datafinger-explore1/iceberg/dev/warehouse/

方法六:批量删除使用 通配符** 和前后同类命名(包含扩展名)的方式删除,实践如下:

jiashuyue@cloudshell:~ (qijifei-test)$ gsutil ls gs://prod-datafinger-explore1/**
gs://prod-datafinger-explore1/iceberg/
gs://prod-datafinger-explore1/iceberg/dev/
gs://prod-datafinger-explore1/iceberg/dev/warehouse/
gs://prod-datafinger-explore1/iceberg/dev/warehouse/11.docx
gs://prod-datafinger-explore1/iceberg/dev/warehouse/12.docx
gs://prod-datafinger-explore1/iceberg/dev/warehouse/13.docx
gs://prod-datafinger-explore1/iceberg/dev/warehouse/14.docx
jiashuyue@cloudshell:~ (qijifei-test)$ gsutil rm gs://prod-datafinger-explore1/iceberg/dev/warehouse/**.docx
** behavior is undefined if directly preceeded or followed by with characters other than / in the cloud and / locally.** behavior is undefined if directly preceeded or followed by with characters other than / in the cloud and / locally.** behavior is undefined if directly preceeded or followed by with characters other than / in the cloud and / locally.** behavior is undefined if directly preceeded or followed by with characters other than / in the cloud and / locally.** behavior is undefined if directly preceeded or followed by with characters other than / in the cloud and / locally.Removing gs://prod-datafinger-explore1/iceberg/dev/warehouse/11.docx...
Removing gs://prod-datafinger-explore1/iceberg/dev/warehouse/12.docx...
Removing gs://prod-datafinger-explore1/iceberg/dev/warehouse/13.docx...
Removing gs://prod-datafinger-explore1/iceberg/dev/warehouse/14.docx...
/ [4 objects]
Operation completed over 4 objects.
jiashuyue@cloudshell:~ (qijifei-test)$ gsutil ls gs://prod-datafinger-explore1/**
gs://prod-datafinger-explore1/iceberg/dev/warehouse/

-R 和 -r 选项是同义词。导致桶或桶子目录内容(它包含的所有对象和子目录)被递归删除。如果与仅限存储桶的 URL(如 gs://bucket)一起使用,则在删除对象和子目录后,gsutil 会删除存储桶。此选项暗含 -a 选项并删除所有对象版本。如果只想删除活动对象版本,请使用** 通配符 而不是 -r。

-a 删除对象的所有版本。

发表评论

您的电子邮箱地址不会被公开。