天天看點

Cloud Storage 批量遞歸删除存儲對象

作者:MeshCloud脈時雲

作者:MeshCloud脈時雲CSM 賈舒悅

一、引言

Cloud Storage 是一項用于将使用者的對象存儲在 Google Cloud 中的服務。對象是由任意格式的檔案組成的不可變的資料段。對象存儲在稱為存儲桶的容器中。所有存儲桶都與項目相關聯,可以在組織下對項目進行分組。Google Cloud 中的每個項目、存儲桶和對象都屬于 Google Cloud 資源,Compute Engine 執行個體等也屬于資源。

建立項目後,可以建立 Cloud Storage 存儲分區,上傳對象至存儲分區,以及從存儲分區中下載下傳對象。還可以授予權限,使資料可供指定的主帳号通路;或者針對某些用例(例如托管網站),資料可供公共網際網路上的所有人通路。

二、整體架構

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 删除對象的所有版本。

繼續閱讀