Хранилище blob delete-batch для удаления всех BLOB-объектов, кроме двух каталогов с похожими именами - PullRequest
1 голос
/ 17 марта 2020

Благодаря ответу @ Джим Сюй Я далеко продвинулся, но остаюсь со следующей проблемой. Я хочу удалить все файлы, кроме тех, которые находятся в папке data и cms.

Текущие файлы

  - 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_old и css не удаляются. Это, вероятно, из-за используемого [] (обычно это глобус как или), поэтому data_old и css совпадают. Но как я могу их удалить? Я пробовал --pattern '(!data&&!cms)*' и --pattern '!data&&!cms*' безуспешно.

1 Ответ

1 голос
/ 17 марта 2020

Это может быть трудной задачей для az storage blob delete-batch. Поддерживаемые шаблоны ограничены '*', '?', '[seq]' и '[!seq]', которые находятся в модуле Pythons fnmatch , и их может быть недостаточно для вашего варианта использования.

Вместо этого вы можете написать скрипт Azure PowerShell , который сделает это за вас. Существует множество удобных командлетов управления Az.Storage , которые можно использовать для выполнения этой задачи.

Демонстрация:

$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"
...