user4856537
user4856537

Reputation:

Delete a "folder" in Azure Blob Storage

I would like to delete a folder from the container of my Azure Blob Storage account. This one contains 3 000 000+ files and using Azure Storage Explorer it is a pretty long process (1 000 files/5 min) so I would like to know if it is possible to delete a folder at once.

I am aware there is no "folder" in Azure Blob Storage and it is more a virtual path to access a blob but regarding batch deletion for a huge amount of blobs it is problematic.

Upvotes: 0

Views: 7776

Answers (3)

Jonas Toelke
Jonas Toelke

Reputation: 11

rclone is a great tool to interact with cloud storage. try rclone purge

Upvotes: 1

Dongminator
Dongminator

Reputation: 825

As others have already mentioned, you cannot delete a "folder" in Azure Blob Storage. You have to use workaround like listing all files with a prefix and then running a for loop to delete each of them.

In PowerShell, you can simplify these 2 steps in one line by running the following command (using the AzureRM module):

Get-AzureStorageBlob -Context $context -Container $container -Blob 'FolderName*' | Remove-AzureStorageBlob -WhatIf

The -WhatIf option will print out the exact actions it is going to take. What I observed is that it will print What if: Performing the operation "Remove blob" on target ... for each file in the "folder". That probably means this is actually doing individual file deletion.

Upvotes: 0

Ben I'd recommend using this Powershell script allowing the deletion of 10,000 a time:

This PowerShell script, designed to run in Azure Automatiom, deletes huge number of blobs in a container, by processing them in chunks of 10,000 blobs at a time. When the number of blobs grows beyond a couple of thousands, the usual method of deleting each blob at a time may just get suspended without completing the task. This could be used to to delete all blobs (when parameter retentionDays is supplied as 0), or certain blobs which has not been modified for the last rententionDays number of days.

Script can be downloaded here: https://gallery.technet.microsoft.com/Delete-large-number-of-97e04976

    <#
.Synopsis
  Deletes large number of blobs in a container of Storage account, which are older than x days

.DESCRIPTION
  This Runbook deletes huge number of blobs in a container, by processing them in chunks of 10,000 blobs at a time. When the number of blobs grow beyond a couple of thousands, the usual method of deleting each blob at a time may just get suspended without completing the task. 

.PARAMETER CredentialAssetName
    The Credential asset which contains the credential for connecting to subscription

.PARAMETER Subscription
    Name of the subscription attached to the credential in CredentialAssetName

.PARAMETER container
    Container name from which the blobs are to be deleted

.PARAMETER AzStorageName
    The Storage Name to which the container belong to

.PARAMETER retentionDays
    Retention days. Blobs older than these many days will be deleted. To delete all, use 0

.NOTES
   AUTHOR: Anurag Singh, MSFT
   LASTEDIT: March 30, 2016
#>

function delete-blobs
{   
    param (
        [Parameter(Mandatory=$true)] 
        [String]  $CredentialAssetName,

        [Parameter(Mandatory=$true)]
        [String] $Subscription,

        [Parameter(Mandatory=$true)] 
        [String] $container,

        [Parameter(Mandatory=$true)] 
        [String] $AzStorageName,

        [Parameter(Mandatory=$true)] 
        [Int] $retentionDays
    )

$Cred = Get-AutomationPSCredential -Name $CredentialAssetName
$Account = Add-AzureAccount -Credential $Cred

if(!$Account) 
{
    write-output "Connection to Azure Subscription using the Credential asset failed..."
    Break;
}

set-AzureSubscription -SubscriptionName $Subscription

$AzStorageKey = (Get-AzureStorageKey -StorageAccountName $AzStorageName).Primary
$context = New-AzureStorageContext -StorageAccountName $AzStorageName -StorageAccountKey $AzStorageKey


$blobsremoved = 0
$MaxReturn = 10000
$Total = 0
$Token = $Null
$TotalDel = 0
$dateLimit = (get-date).AddDays(-$retentionDays) 

try
{
    do
    {
        Write-Output "Retrieving blobs"
        $blobs = Get-AzureStorageBlob -Container $container -context $context -MaxCount $MaxReturn  -ContinuationToken $Token 
        $blobstodelete =  $blobs | where LastModified -LE $dateLimit
        $Total += $Blobs.Count
        Write-Output "$Total  total Retrieved blobs"

        $Token = $Blobs[$blobs.Count -1].ContinuationToken;

        if($Blobs.Length -le 0) 
        { 
            break;
        }

        if($blobstodelete.Length -le 0) 
        { 
            continue;
        }

        $TotalDel += $blobstodelete.Count

        $blobstodelete  | Remove-AzureStorageBlob -Force 

        Write-Output "$TotalDel  blobs deleted"
    }
    While ($Token -ne $Null)
}

catch 
{
    write-output $_
}

}

Upvotes: 1

Related Questions