剛在整理 Azure Storage Blob 上面的備份檔案,發現有一千多個檔案已經太舊了,我原本想要批次刪除這些檔案,結果發現 AzCopy 不支援萬用字元(*
)語法,上網找了一下解法,大多都說沒辦法。今天我就來分享這個非常方便的小技巧。
萬事問 ChatGPT、StackOverflow 還是 Google?
最近一週 ChatGPT 這個 AI 聊天機器人橫掃全球,現在遇到任何問題,都不是先 Google 看看,或是到 StackOverflow 找答案,而是先問 ChatGPT 再說:
我問了:how to batch delete files using azcopy?
結果 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
個檔案,真的超快!😍
值得注意的是,這個 --include-pattern
只能用來比對「檔案名稱」而已,不能用來比對「路徑」部分。
若要用來比對路徑部分,要改用 --include-path
參數,但該參數就不支援萬用字元(*
)來比對路徑名稱了,以下是使用範例:
azcopy rm https://[storacc].blob.core.windows.net/web-backup/ --include-path="web1/2022/" --recursive
注意: 一定要加上 --recursive
才能刪除該 web1/2022/
目錄與其子目錄下的所有檔案。
相關連結