Storage blob delete-batch 删除所有 blob,不包括两个具有相似名称的目录

Storage blob delete-batch to delete all blobs excluding two directories with similar names

感谢 的回答,我已经走了很远,但我仍然遇到以下问题。我想删除文件夹 datacms 以外的所有文件。

当前文件

  - cms/a2907135_1800x900.jpg
  - cms/c1964f4e_1800x900.jpg
  - css/app.9e1921c7.css
  - css/chunk-vendors.4bdbfeab.css
  - css/pageContent.88886da1.css
  - data/themes.json
  - data/website.json
  - data_old/downloads.json
  - data_old/staff.json
  - data_old/themes.json
  - data_old/website.json
  - img/flags.5fa419a7.png
  - img/star/favicon.ico
  - img/via/favicon.ico
  - img/via/favicon.png
  - img/via/mask-icon.svg
  - img/via/touch-icon-ipad-retina.png
  - img/via/touch-icon-ipad.png
  - img/via/touch-icon-iphone-retina.png
  - img/via/touch-icon-iphone.png
  - index.html
  - js/app.136c0496.js
  - js/app.136c0496.js.map
  - js/chunk-vendors.2dcffb72.js
  - js/chunk-vendors.2dcffb72.js.map
  - js/pageContent.55ebca01.js
  - js/pageContent.55ebca01.js.map
  - js/pageHome.e085832d.js
  - js/pageHome.e085832d.js.map
  - js/pageNotFound.e5d65257.js
  - js/pageNotFound.e5d65257.js.map
  - robots.txt

使用az storage blob delete-batch删除模式为--pattern '[!data&&!cms]*'的文件会导致删除以下文件

  - img/flags.5fa419a7.png
  - img/star/favicon.ico
  - img/via/favicon.ico
  - img/via/favicon.png
  - img/via/mask-icon.svg
  - img/via/touch-icon-ipad-retina.png
  - img/via/touch-icon-ipad.png
  - img/via/touch-icon-iphone-retina.png
  - img/via/touch-icon-iphone.png
  - index.html
  - js/app.136c0496.js
  - js/app.136c0496.js.map
  - js/chunk-vendors.2dcffb72.js
  - js/chunk-vendors.2dcffb72.js.map
  - js/pageContent.55ebca01.js
  - js/pageContent.55ebca01.js.map
  - js/pageHome.e085832d.js
  - js/pageHome.e085832d.js.map
  - js/pageNotFound.e5d65257.js
  - js/pageNotFound.e5d65257.js.map
  - robots.txt

文件夹data_oldcss没有被删除。这可能是因为使用了 [](通常是 glob as or),所以 data_oldcss 是匹配的。但是我怎样才能删除它们呢?我试过 --pattern '(!data&&!cms)*'--pattern '!data&&!cms*' 都没有成功。

对于 az storage blob delete-batch. The supported patterns are limited to '*', '?', '[seq]', and '[!seq]', which are found at Pythons fnmatch 模块来说,这可能是一项艰巨的任务,而且对于您的用例来说可能还不够。

相反,您可以编写一个 Azure PowerShell script to do this for you. There are alot of handy Az.Storage 管理 cmdlet 来执行此任务。

演示:

$storageAccountName = "STORAGE_ACCOUNT_NAME"
$storageAccountKey = "STORAGE_ACCOUNT_KEY"

$container = "web"
$foldersToKeep = "data", "cms"

$storageContext = New-AzStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $storageAccountKey

Get-AzStorageBlob -Context $storageContext -Container $container -Blob * | ForEach-Object {
    $contents = $_.Name.Split("/")
    if ($contents.Length -gt 1 -and $contents[0] -notin $foldersToKeep) {
        Write-Host "Deleting $($_.Name)"
        Remove-AzStorageBlob -Container $container -Blob $_.Name -Context $storageContext
    }
}

您还可以将其包装到函数中以实现可重用性:

function Remove-AzureBlobsFromFolders {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory=$true)]
        [string]$Container,
        [Parameter(Mandatory=$true)]
        [string[]]$ExcludeFolders,
        [Parameter(Mandatory=$true)]
        [string]$StorageAccountName,
        [Parameter(Mandatory=$true)]
        [string]$StorageAccountKey
    )

    $storageContext = New-AzStorageContext `
        -StorageAccountName $StorageAccountName `
        -StorageAccountKey $StorageAccountKey

    Get-AzStorageBlob -Context $storageContext -Container $Container -Blob * | ForEach-Object {
        $contents = $_.Name.Split("/")
        if ($contents.Length -gt 1 -and $contents[0] -notin $ExcludeFolders) {
            Write-Host "Deleting $($_.Name)"
            Remove-AzStorageBlob -Container $Container -Blob $_.Name -Context $storageContext
        }
    }
}

Remove-AzureBlobsFromFolders `
    -Container "web" `
    -ExcludeFolders "data", "cms" `
    -StorageAccountName "STORAGE_ACCOUNT_NAME" `
    -StorageAccountKey "STORAGE_ACCOUNT_KEY"