The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

如何透過 AzCopy (v10) 批次刪除 Azure Storage Blob 上面的檔案

剛在整理 Azure Storage Blob 上面的備份檔案,發現有一千多個檔案已經太舊了,我原本想要批次刪除這些檔案,結果發現 AzCopy 不支援萬用字元(*)語法,上網找了一下解法,大多都說沒辦法。今天我就來分享這個非常方便的小技巧。

image

萬事問 ChatGPT、StackOverflow 還是 Google?

最近一週 ChatGPT 這個 AI 聊天機器人橫掃全球,現在遇到任何問題,都不是先 Google 看看,或是到 StackOverflow 找答案,而是先問 ChatGPT 再說:

我問了:how to batch delete files using azcopy?

how to batch delete files using azcopy? -- ChatGPT

結果 ChatGPT 回答了一個錯誤的答案,很明顯就是在亂說,因為 --include 參數從來都不支援 * 萬用字元!

我後來跑去 StackOverflow 找到了 Azcopy remove by folder pattern 問題,但解答是 2020 年寫的,當時他寫「路徑」無法用萬用字元並沒有支援批次刪除。

最後,我還是透過 Google 找到了微軟官方 Microsoft Learn 的 azcopy remove 文件,從這裡找到的真正「權威」的解答。

由於所有的雲端服務變化都飛快,一年就會改版好幾次,像是 AzCopy 這種 CLI 工具,只要有用戶反應問題,通常很快的都可以加上功能,所以光是靠「搜尋」或「提問」還是很難找到真正想要的答案。

解決方案

我原本的想法還蠻笨的,想說用跑迴圈的方式解決,但一千多個檔案,刪除速度實在是太慢了:

azcopy list https://[storacc].blob.core.windows.net/web-backup/ --output-type json | ConvertFrom-Json | ForEach-Object {
  # 這裡還要解析 Log 訊息中的檔名,非常不方便
}
TimeStamp      : 2022/12/13 下午 04:02:23
MessageType    : Info
MessageContent : INFO: Views/Shared/_ValidationScriptsPartial.cshtml;  Content Length: 176.00 B
PromptDetails  : @{PromptType=; ResponseOptions=; PromptTarget=}

我從官網文件發現了一個 --include-pattern 這個參數,透過這個參數就可以使用萬用字元(*)來比對檔名格式,快速的刪除大量檔案! 👍

以下是我刪除大量檔案的命令範例:

azcopy rm https://[storacc].blob.core.windows.net/web-backup/ --include-pattern="2017_*"

從下圖可以得知,我只花了 66.7ms 就成功刪除了 1,806 個檔案,真的超快!😍

image

值得注意的是,這個 --include-pattern 只能用來比對「檔案名稱」而已,不能用來比對「路徑」部分。

若要用來比對路徑部分,要改用 --include-path 參數,但該參數就不支援萬用字元(*)來比對路徑名稱了,以下是使用範例:

azcopy rm https://[storacc].blob.core.windows.net/web-backup/ --include-path="web1/2022/" --recursive

注意: 一定要加上 --recursive 才能刪除該 web1/2022/ 目錄與其子目錄下的所有檔案。

相關連結

留言評論