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

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

![image](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/c0b88224978170bb690d-207261836-a2886ab7-7ac6-4f2a-a9ed-3cabb18673c9.png)

### 萬事問 ChatGPT、StackOverflow 還是 Google？

最近一週 ChatGPT 這個 AI 聊天機器人橫掃全球，現在遇到任何問題，都不是先 Google 看看，或是到 [StackOverflow](https://stackoverflow.com/) 找答案，而是先問 ChatGPT 再說：

我問了：`how to batch delete files using azcopy?`

![how to batch delete files using azcopy? -- ChatGPT](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/c017b9fd9bd82a4dbdff-207244529-8f9fe474-dac1-40e2-bfef-3969e43d6125.png)

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

我後來跑去 [StackOverflow](https://stackoverflow.com/) 找到了 [Azcopy remove by folder pattern](https://stackoverflow.com/a/61888690/910074) 問題，但解答是 2020 年寫的，當時他寫「路徑」無法用萬用字元並沒有支援批次刪除。

最後，我還是透過 Google 找到了微軟官方 Microsoft Learn 的 [azcopy remove](https://learn.microsoft.com/en-us/azure/storage/common/storage-ref-azcopy-remove?toc=%2Fazure%2Fstorage%2Fblobs%2Ftoc.json&WT.mc_id=DT-MVP-4015686#examples) 文件，從這裡找到的真正「權威」的解答。

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

### 解決方案

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

```powershell
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` 這個參數，透過這個參數就可以使用**萬用字元**(`*`)來比對檔名格式，快速的刪除大量檔案！ 👍

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

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

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

![image](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/9761dd26d79a636eef9b-207256672-e157606c-03fb-4866-bba2-a82895070e25.png)

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

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

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

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

### 相關連結

-   [AzCopy v10 configuration settings (Azure Storage)](https://learn.microsoft.com/en-us/azure/storage/common/storage-ref-azcopy-configuration-settings?WT.mc_id=DT-MVP-4015686)
-   [azcopy remove | Microsoft Learn](https://learn.microsoft.com/en-us/azure/storage/common/storage-ref-azcopy-remove?toc=%2Fazure%2Fstorage%2Fblobs%2Ftoc.json&WT.mc_id=DT-MVP-4015686#examples)
