共用方式為


使用 Azure CLI 管理區塊 Blob

Blob 儲存體支援區塊 Blob、附加 Blob 和分頁 Blob。 區塊 Blob 已最佳化,可以有效率地上傳大量資料。 區塊 Blob 很適合用來儲存影像、文件,以及其他不受隨機讀取和寫入作業影響的資料類型。 本文說明如何使用區塊 Blob。

必要條件

若要存取 Azure 儲存體,您需要有 Azure 訂用帳戶。 如果您還沒有訂用帳戶,請先建立免費帳戶,再開始操作。

對 Azure 儲存體的所有存取都是透過儲存體帳戶進行。 在本快速入門中,使用 Azure 入口網站、Azure PowerShell 或 Azure CLI 建立儲存體帳戶。 如需建立儲存體帳戶的協助,請參閱建立儲存體帳戶

備妥環境以使用 Azure CLI

  • 本文需要 2.0.46 版或更新版本的 Azure CLI。 如果您是使用 Azure Cloud Shell,就已安裝最新版本。

授與 Blob 儲存體的存取權

您可以使用 Microsoft Entra 認證或使用儲存體帳戶存取金鑰,來授權從 Azure CLI 存取 Blob 儲存體。 建議使用 Microsoft Entra 認證,本文的範例只使用 Microsoft Entra ID。

針對 Blob 儲存體的資料作業 Azure CLI 命令可支援 --auth-mode 參數,這可讓您指定如何授權指定的作業。 將 --auth-mode 參數設定為 login,以使用 Microsoft Entra 認證進行授權。 只有 Blob 儲存體資料作業可支援 --auth-mode 參數。 管理作業 (例如建立資源群組或儲存體帳戶) 會自動使用 Microsoft Entra 認證來進行授權。 如需詳細資訊,請參閱選擇如何使用 Azure CLI 來授權存取 Blob 資料

執行 login 命令,以開啟瀏覽器並連線到您的 Azure 訂用帳戶。


az login

建立容器

所有 Blob 資料都會儲存在容器中,因此您至少要有一個容器資源,才能上傳資料。 如有需要,請使用下列範例來建立儲存體容器。 如需詳細資訊,請參閱使用 Azure CLI 管理 Blob 容器


#!/bin/bash
storageAccount="<storage-account>"
containerName="demo-container"

# Create a container object
az storage container create \
    --name $containerName \
    --account-name $storageAccount
    --auth-mode login

使用本文所包含的範例時,必須將括弧中的預留位置值取代為您自己的值。 如需關於使用 Azure CLI 登入 Azure 的詳細資訊,請參閱使用 Azure CLI 登入

上傳 Blob

Azure CLI 會根據您的需求,提供可在一個資源或多個資源上執行作業的命令。

若要將檔案上傳至區塊 Blob,請將必要的參數值傳至 az storage blob upload 命令。 以 --file 參數提供來源路徑和檔案名稱,並以 --container-name 參數提供目的地容器的名稱。 您也需要提供 --account-name 參數。 此命令會建立新的 Blob,或覆寫已存在的原始 Blob。

您可以使用 az storage blob upload-batch 命令,以遞迴方式將多個 Blob 上傳至儲存體容器。 您可以使用 Unix 檔案名稱模式比對來指定要使用 --pattern 參數上傳的檔案範圍。 支援的模式為 *?[seq][!seq]。 若要深入了解,請參閱有關 Unix 檔案名稱模式比對的 Python 文件。

在下列範例中,第一個作業會使用 az storage blob upload 命令來上傳單一具名檔案。 來源檔案和目的地儲存體容器會使用 --file--container-name 參數來指定。

第二個作業會示範如何使用 az storage blob upload-batch 命令來上傳多個檔案。 --if-modified-since 參數可確保系統只會上傳在過去七天內有所修改的檔案。 此參數所提供的值必須以 UTC 格式提供。


#!/bin/bash
storageAccount="<storage-account>"
containerName="demo-container"
lastModified=$(date +%Y:%m:%d -d "7 days ago")

path="C:\\temp\\"
filename="demo-file.txt"
imageFiles="*.png"
file="$path$filename"

#Upload a single named file
az storage blob upload \
    --file $file \
    --container-name $containerName \
    --account-name $storageAccount \
    --auth-mode login

#Upload multiple image files recursively
az storage blob upload-batch \
    --destination $containerName \
    --source $path \
    --pattern *.png \
    --account-name $storageAccount \
    --auth-mode login \
    --if-modified-since $lastModified

列出 Blob

根據預設,az storage blob list 命令會列出儲存在容器內的所有 Blob。 您可以使用多種不同的方法來定義搜尋範圍。 記憶體帳戶可以擁有的容器或 Blob 數目沒有任何限制。 若要避免擷取數以千計的 Blob,建議您限制傳回的資料量。

使用 --prefix 參數可選取單一已知檔案或名稱開頭為所定義字串的檔案範圍。 您可以將虛擬目錄指定為 參數的 --prefix 一部分。

根據預設,列出作業中只會傳回 Blob。 在某些情況下,您可能想要傳遞 參數的值 --include ,以傳回其他類型的物件,例如虛刪除的 Blob、快照集和版本。 這些值可以結合以傳回多個物件類型。

--num-results參數可用來限制從容器傳回的 Blob 數目。 對所有 Azure 資源都會施加 5,000 的服務限制。 這項限制可確保會擷取可管理的資料量,且效能不受影響。 如果傳回的 Blob 數目超過 --num-results 值或服務限制,則會傳回接續權杖。 此權杖可讓您使用多個要求來擷取任意數量的 Blob。 詳細資訊請見列舉 Blob 資源

下列範例說明數種用來提供 Blob 清單的方法。 第一種方法會列出指定容器內的所有 Blob。 第二種方法會使用 --prefix 參數來列出容器中開頭為指定前置詞的所有 Blob。第三種方法會使用 --num-results 參數來限制傳回的結果,而 --show-next-marker 參數則會在結果中包含接續令牌。 當結果中有接續令牌時,它會傳遞至後續的呼叫 az storage blob list ,以擷取下一組結果。

如需詳細資訊,請參閱 az storage blob list reference。

#!/bin/bash
storageAccount="<storage-account>"
containerName="<container-name>"
blobPrefix="<prefix-string>"
numResults=5

#Approach 1: List all blobs in a container by name.

az storage blob list \
    --account-name $storageAccount \
    --container $containerName \
    --query "[].name" \
    --auth-mode login \
    --output tsv

#Approach 2: Use the --prefix parameter to list blobs starting with specified prefix.

az storage blob list \
    --account-name $storageAccount \
    --container $containerName \
    --prefix $blobPrefix \
    --query "[].name" \
    --auth-mode login \
    --output tsv

#Approach 3: Use the continuation token to return the complete set of results.

get_blobs() {
    if [ -z "$nextMarker" ]; then
        az storage blob list --container-name $containerName --num-results $numResults --account-name $storageAccount --show-next-marker --only-show-errors --auth-mode login
    else
        az storage blob list --container-name $containerName --num-results $numResults --marker $nextMarker --account-name $storageAccount --show-next-marker --only-show-errors --auth-mode login
    fi
}
 
total=0
nextMarker=""
while true; do
    blobs=$(get_blobs $containerName $numResults $storageAccount $nextMarker) 
    nextMarker=""
    blobsLength=$(echo $blobs | jq length)
    
    if [ $blobsLength -le 0 ]; then
        break
    fi
    
    blobIndex=0
    while read blob; do
        if [ $blobIndex -eq $(($blobsLength-1)) ]; 
        then
            nextMarker="$(echo $blob | jq -r .nextMarker)"
        else
            blobName=$(echo $blob | jq .name)
            echo "blobname: $blobName"
        fi
        ((blobIndex++))
    done <<<$(echo $blobs | jq -c '.[]')
 
    total=$(($total+$blobsLength-1))
    echo "Processed $total blobs so far"
    # echo "nextMarker: $nextMarker"
    if [ "${nextMarker}" = "null" ]; then
        echo -e "\nAccountName: $storageAccount, ContainerName: $containerName "
        echo "Processed $total blobs in total."
        break
    fi
done

下載 Blob

視您的使用案例而定,您會使用 az storage blob downloadaz storage blob download-batch 命令來下載 Blob。 若要下載個別 Blob,請直接呼叫 az storage blob download 命令,並傳遞 --container-name--file--name 參數的值。 Blob 預設會下載到殼層目錄,但可以指定替代位置。 如果您指定的路徑不存在,作業將會失敗,並出現錯誤。

若要以遞迴方式從儲存體容器下載多個 Blob,請使用 az storage blob download-batch 命令。 此命令會透過 --pattern 參數來支援 Unix 檔案名稱模式比對。 支援的模式為 *?[seq][!seq]。 若要深入了解,請參閱有關 Unix 檔案名稱模式比對的 Python 文件。

下列範例程式碼會提供單一和多個下載方法的範例。 此外也提供了簡單的方法,讓您能夠使用萬用字元來搜尋特定檔案的所有容器。 由於某些環境可能會有數千個資源,因此建議使用 --num-results 參數。

如需詳細資訊,請參閱 az storage blob downloadaz storage blob download batchreference。

#!/bin/bash
#Set variables
storageAccount="<storage-account>"
containerName="demo-container"

destinationPath="C:\\temp\\downloads\\"
destinationFilename="downloadedBlob.txt"
file="$destinationPath$destinationFilename"
sourceBlobName="demo-file.txt"

#Download a single named blob

az storage blob download \
    --container $containerName \
    --file $file \
    --name $sourceBlobName \
    --account-name $storageAccount \
    --auth-mode login

#Download multiple blobs using a pattern value

az storage blob download-batch \
    --destination $destinationPath \
    --source $containerName \
    --pattern images/*.png \
    --account-name $storageAccount \
    --auth-mode login

#Use a loop to download matching blobs in a list of containers

containerList=$( \
    az storage container list \
        --query "[].name" \
        --num-results 5 \
        --account-name $storageAccount \
        --auth-mode login \
        --output tsv 
)
for row in $containerList
do
    tmpName=$(echo $row | sed -e 's/\r//g')
    echo $tmpName
   
    az storage blob download-batch \
        --destination $destinationPath \
        --source $tmpName \
        --pattern *louis*.* \
        --account-name $storageAccount \
        --auth-mode login
done

管理 Blob 屬性和中繼資料

Blob 會公開系統屬性和使用者定義的中繼資料。 系統屬性存在於每個 Blob 儲存體資源上。 有些屬性是唯讀的,有些則可供讀取或設定。 實際上,有些系統屬性會對應至特定的標準 HTTP 標頭。

使用者定義的中繼資料由您為 Blob 儲存體資源指定的一或多個名稱/值組所組成。 您可以使用中繼資料來儲存資源的額外值。 中繼資料值僅供您自己使用,並不會影響資源的運作方式。

讀取 Blob 屬性

若要讀取 Blob 屬性或中繼資料,必須先從服務擷取 Blob。 請使用 az storage blob show 命令來擷取 Blob 的屬性和中繼資料,而不是其內容。 下列範例會擷取 Blob 並列出其屬性。

如需詳細資訊,請參閱 az storage blob show reference。

#!/bin/bash
#Set variables
storageAccount="<storage-account>"
containerName="demo-container"

az storage blob show \
    --container  demo-container \
    --name demo-file.txt \
    --account-name $storageAccount \
    --auth-mode login

讀取和寫入 Blob 中繼資料

Blob 中繼資料是一組與 Blob 相關聯的選用名稱/值組。 如前述範例所示,最初並沒有與 Blob 相關聯的中繼資料,但可在必要時加以新增。 若要讀取,請使用 az storage blob metadata show 命令。 若要更新 Blob 中繼資料,請使用 az storage blob metadata update 並提供索引鍵/值組陣列。 如需詳細資訊,請參閱 az storage blob metadata 參考。

如需詳細資訊,請參閱 az storage blob metadata 參考。

下列範例會先更新 Blob 的中繼資料,然後在認可後加以擷取。

#!/bin/bash
storageAccount="<storage-account>"
containerName="demo-container"
blobName="blue-moon.mp3"

metadata=("Written=1934" "Recorded=1958")
metadata+=("Lyricist=Lorenz Hart")
metadata+=("Composer=Richard Rogers")
metadata+=("Artist=Tony Bennett")

#Update metadata
az storage blob metadata update \
    --container-name $containerName \
    --name $blobName \
    --metadata "${metadata[@]}" \
    --account-name $storageAccount \
    --auth-mode login

#Retrieve updated blob metadata
az storage blob metadata show \
    --container-name $containerName \
    --name $blobName \
    --account-name $storageAccount \
    --auth-mode login

Blob 的複製作業

有許多案例可以複製不同類型的 Blob。 本文中的範例限用於區塊 Blob。 Azure CLI 會根據您的需求,提供可在一個資源或多個資源上執行作業的命令。

若要複製特定 Blob,請使用 az storage blob copy start 命令,並指定來源和目的地容器與 Blob 的值。 您也可以提供統一資源識別項 (URI)、共用或共用存取簽章 (SAS) 來作為來源。

您也可以指定要在什麼條件下複製 Blob。 您可以針對來源或目的地 Blob 來設定這些條件。 您可以參考上次修改的日期、標籤資料或 ETag 值。 例如,您可以選擇將最近未經修改的 Blob 複製到不同容器。 如需詳細資訊,請參閱指定 Blob 服務作業的條件式標頭

您可以使用 az storage blob copy start-batch 命令,以遞迴方式在相同儲存體帳戶內的儲存體容器之間複製多個 Blob。 此命令需要 --source-container--destination-container 參數的值,而且可以在來源和目的地之間複製所有檔案。 如同其他 CLI 批次命令,此命令也會使用 --pattern 參數來支援 Unix 檔案名稱模式比對。 支援的模式為 *?[seq][!seq]。 若要深入了解,請參閱有關 Unix 檔案名稱模式比對的 Python 文件。

注意

請考慮使用 AzCopy 以實現簡化和效能,特別是在儲存體帳戶之間複製 Blob 時。 AzCopy 是命令列公用程式,可讓您在儲存體帳戶之間複製 Blob 或檔案。 深入了解如何開始使用 AzCopy

如需詳細資訊,請參閱 az storage blob copy 參考。

下列範例程式碼會提供單一和多個複製作業的範例。 由於某些環境可能會有數千個資源,因此建議使用 --num-results 參數。 第一個範例會將 secret-town-road.png Blob 從 photos 容器複製到 locations 容器。 兩個容器存在於相同的儲存體帳戶中。 結果會驗證複製作業是否成功。

#!/bin/bash
storageAccount="<storage-account>"
sourceContainer="photos"
blobName="secret-town-road.jpg"
destContainer="locations"

az storage blob copy start \
    --destination-container $destContainer \
    --destination-blob $blobName \
    --source-container $sourceContainer \
    --source-blob $blobName \
    --account-name $storageAccount \
    --auth-mode login

快照集 Blob

任何與基底 Blob 相關聯的租用不會影響快照集。 您無法取得快照集上的租用。 深入了解 Blob 快照集。 如需詳細資訊,請參閱 az storage blob snapshot 參考。

下列範例程式碼會從儲存體容器中擷取 Blob,並建立其快照集。

#!/bin/bash
storageAccount="<storage-account>"
containerName="demo-container"
blobName="demo-file.txt"

az storage blob snapshot \
    --container-name $containerName \
    --name Blue-Moon.mp3 \
    --account-name $storageAccount \
    --auth-mode login

設定 Blob 層

當您變更 Blob 的階層時,會將該 Blob 及其所有資料移至目標層。 您可以使用 az storage blob set-tier 命令在經常性存取層非經常性存取層封存層之間進行變更。

視您的需求而定,您也可以利用複製 Blob 作業,將 Blob 從某一層複製到另一層。 複製 Blob 作業會在所需的層中建立新的 Blob,同時讓來源 Blob 保留在原始層中。

非經常性存取層經常性存取層變更為封存層會近乎即時地發生。 Blob 移至封存層後會被視為離線,且無法讀取或修改。 您必須先將封存 Blob 的資料解除凍結到線上層,才能讀取或修改這類資料。 深入了解如何從封存層將 Blob 解除凍結

如需詳細資訊,請參閱 az storage blob set-tier 參考。

下列範例程式碼會將 archive 容器內單一具名 Blob 的階層設定為經常性存取層

#!/bin/bash
storageAccount="<storage-account>"
containerName="demo-container"

az storage blob set-tier 
    --container-name $containerName \
    --name Blue-Moon.mp3 \
    --tier Hot \
    --account-name $storageAccount \
    --auth-mode login

使用 Blob 標籤的作業

Blob 索引標籤可讓資料更容易管理和探索。 Blob 索引標籤是使用者定義的索引鍵/值索引屬性,可以套用至 Blob。 設定之後,您就可以在個別容器內或所有容器間分類及尋找物件。 Blob 資源可藉由更新其索引標籤來動態分類,而不需要在容器組織中變更。 這種方法讓您得以靈活因應持續變化的資料需求。 您可以同時使用中繼資料和索引標籤。 如需索引標籤的詳細資訊,請參閱使用 Blob 索引標籤管理和尋找 Azure Blob 資料

提示

下面提供的程式碼範例會使用模式比對,從具有已知結構的 XML 檔案取得文字。 此範例可用來說明使用基本 Bash 功能新增 Blob 標籤的簡化方法。 在取用生產工作負載的資料時,一律建議使用實際的資料剖析工具。

下列範例說明如何將 Blob 索引標籤新增至一系列的 Blob。 此範例會從 XML 檔案讀取資料,並且用來建立數個 Blob 的索引標籤。 若要使用範例程式碼,請在您的 C:\temp 目錄中建立本機 blob-list.xml 檔案。 以下提供 XML 資料。

如需詳細資訊,請參閱 az storage blob set-tier 參考。

<Venue Name="House of Prime Rib" Type="Restaurant">
  <Files>
    <File path="transactions/12027121.csv" />
    <File path="campaigns/radio-campaign.docx" />
    <File path="photos/bannerphoto.png" />
    <File path="archive/completed/2020review.pdf" />
    <File path="logs/2020/01/01/logfile.txt" />
  </Files>
</Venue>

範例程式碼會逐一查看 XML 檔案內的程式行。 其會找出 Venue 元素,並為 NameType 值建立變數。 然後,其會逐一查看其餘程式行,並針對 File 節點所參考的每個 Blob 建立標籤。

#!/bin/bash
storageAccount="<storage-account>"
containerName="demo-container"

while read line
do
  
#Set Tag values 
if echo "$line" | grep -q "<Venue";then
    name=`echo "$line" | cut -d'"' -f 2`
    type=`echo "$line" | cut -d'"' -f 4`
    tags=("name=$name")
    tags+=("type=$type")
fi

#Add tags to blobs
if echo "$line" | grep -q "<File ";then
    blobName=`echo "$line" | cut -d'"' -f 2`
    
    echo az storage blob tag set \
        --container-name $containerName \
        --name $blobName \
        --account-name $storageAccount \
        --auth-mode login \
        --tags "{$tags[@]}"
fi

done < /mnt/c/temp/bloblist.xml

刪除 Blob

您可以使用 az storage blob deleteaz storage blob delete-batch 命令,刪除單一 Blob 或一系列的 Blob。 在刪除多個 Blob 時,您可以使用條件式作業、迴圈或其他自動化,如下列範例所示。

警告

執行下列範例可能會永久刪除 Blob。 Microsoft 建議啟用容器虛刪除,以防止容器和 Blob 遭到意外刪除。 如需詳細資訊,請參閱容器的虛刪除

下列範例程式碼會提供個別和批次刪除作業的範例。 第一個範例會刪除單一具名 Blob。 第二個範例會說明如何使用 Bash 中的邏輯作業來刪除多個 Blob。 第三個範例會使用 delete-batch 命令來刪除格式為 bennett-x 的所有 Blob,但 bennett-2 除外。

如需詳細資訊,請參閱 az storage blob deleteaz storage blob delete-batch 參考。

#!/bin/bash
storageAccount="<storage-account>"
containerName="demo-container"

blobName="demo-file.txt"
blobPrefix="sinatra-"

#Delete a single, named blob
az storage blob delete \
    --container-name $containerName \
    --name $blobName \
    --account-name $storageAccount \
    --auth-mode login

#Iterate a blob list, deleting blobs whose names end with even numbers

## Get list of containers
blobList=$(az storage blob list \
    --query "[].name" \
    --prefix $blobPrefix \
    --container-name $containerName \
    --account-name $storageAccount \
    --auth-mode login \
    --output tsv)

## Delete all blobs with the format *bennett-x* except *bennett-2.*
for row in $blobList
do
    #Get the blob's number
    tmpBlob=$(echo $row | sed -e 's/\r//g') 
    tmpName=$(echo ${row%.*} | sed -e 's/\r//g')

    if [ `expr ${tmpName: ${#blobPrefix}} % 2` == 0 ]
    then
        
        echo "Deleting $tmpBlob"
        az storage blob delete \
            --container-name $containerName \
            --name $tmpBlob \
            --account-name $storageAccount \
            --auth-mode login

  fi
done

#Delete multiple blobs using delete-batch
az storage blob delete-batch \
    --source $containerName \
    --pattern bennett-[!2].* \
    --account-name $storageAccount \
    --auth-mode login

在某些情況下,可以擷取已刪除的 Blob。 如果已啟用記憶體帳戶的虛刪除數據保護選項,傳遞 --include d 參數會傳回在帳戶保留期間內刪除的 Blob。 若要深入了解虛刪除,請參閱 Blob 的虛刪除一文。

使用下列範例,擷取在容器的相關保留期間內刪除的 Blob 清單。 第一個範例會列出所有最近刪除的 Blob 及其刪除日期。 第二個範例會列出所有符合特定前置詞的已刪除 Blob。

#!/bin/bash
storageAccount="<storage-account>"
containerName="demo-container"

blobPrefix="sinatra-"

#Retrieve a list of all deleted blobs
az storage blob list \
    --container-name $containerName \
    --include d \
    --output table \
    --account-name $storageAccount \
    --auth-mode login \
    --query "[?deleted].{name:name,deleted:properties.deletedTime}"

#Retrieve a list of all deleted blobs matching a specific prefix
az storage blob list \
    --container-name $containerName \
    --prefix $blobPrefix \
    --output table \
    --include d \
    --account-name $storageAccount \
    --auth-mode login \
    --query "[].{name:name,deleted:deleted}"

還原已刪除的 Blob

列出 Blob 一節所述,您可以在儲存體帳戶中設定 [虛刪除資料保護] 選項。 啟用此選項時,就可以還原在相關保留期間內刪除的容器。 您也可以使用版本設定可維護舊版 Blob,從而進行每次的復原與還原。

如果同時啟用 Blob 版本設定和 Blob 虛刪除,則修改、覆寫、刪除或還原 Blob 會自動建立新的版本。 您將用來還原已刪除 Blob 的方法取決於記憶體帳戶上是否啟用版本設定。

下列程式碼範例會還原所有虛刪除的 Blob,或者如果已啟用版本設定,則會還原最新版的 Blob。 程式碼會先判斷是否使用 az storage account blob-service-properties show 命令啟用版本設定。

如果啟用版本控制, az storage blob list 命令會擷取所有唯一命名的 Blob 版本清單。 接下來,清單上的 Blob 版本會依日期擷取及排序。 如果找不到 isCurrentVersion 屬性值的版本,az storage blob copy start 命令會用來建立 Blob 最新版本的作用中複本。

如果版本設定已停用,則系統會使用 az storage blob undelete 命令來還原容器中的每個虛刪除 Blob。

您必須先在至少一個儲存體帳戶上啟用虛刪除,然後再遵循這個範例。 若要深入了解虛刪除資料保護選項,請參閱 Blob 的虛刪除一文或 az storage blob undelete 參考。

#!/bin/bash
storageAccount="<storage-account>"
groupName="myResourceGroup"
containerName="demo-container"

blobSvcProps=$(
    az storage account blob-service-properties show \
        --account-name $storageAccount \
        --resource-group $groupName)

softDelete=$(echo "${blobSvcProps}" | jq -r '.deleteRetentionPolicy.enabled')
versioning=$(echo "${blobSvcProps}" | jq -r '.isVersioningEnabled')

# If soft delete is enabled
if $softDelete
then
    
    # If versioning is enabled
    if $versioning
    then

        # Get all blobs and versions using -Unique to avoid processing duplicates/versions
        blobList=$(
            az storage blob list \
                --account-name $storageAccount \
                --container-name $containerName \
                --include dv \--query "[?versionId != null].{name:name}" \
                --auth-mode login -o tsv | uniq)
        
        # Iterate the collection
        for blob in $blobList
        do
            # Get all versions of the blob, newest to oldest
            blobVers=$(
                az storage blob list \
                    --account-name $storageAccount \
                    --container-name $containerName \
                    --include dv \
                    --prefix $blob \
                    --auth-mode login -o json | jq 'sort_by(.versionId) | reverse | .[]')
            # Select the first (newest) object
            delBlob=$(echo "$blobVers" | jq -sr '.[0]')
            
            # Verify that the newest version is NOT the latest (that the version is "deleted")
            if [[ $(echo "$delBlob" | jq '.isCurrentVersion') != true ]]; 
            then
                # Get the blob's versionId property, build the URI to the blob
                versionID=$(echo "$delBlob" | jq -r '.versionId')
                uri="https://$storageAccount.blob.core.windows.net/$containerName/$blob?versionId=$versionID"
                
                # Copy the latest version 
                az storage blob copy start \
                    --account-name $storageAccount \
                    --destination-blob $blob \
                    --destination-container $containerName \
                    --source-uri $uri \
                    --auth-mode login
       
                delBlob=""
            fi
        done

    else

        #Retrieve all deleted blobs
        blobList=$( \
            az storage blob list \
                --container-name $containerName \
                --include d \
                --output tsv \
                --account-name $storageAccount \
                --auth-mode login \
                --query "[?deleted].[name]" \
        )

        #Iterate list of deleted blobs and restore
        for row in $blobList
        do
            tmpName=$(echo $row | sed -e 's/\r//g')
            echo "Restoring $tmpName"
            az storage blob undelete \
                --container-name $containerName \
                --name $tmpName \
                --account-name $storageAccount \
                --auth-mode login
        done

    fi

else
    
    #Soft delete is not enabled
    echo "Sorry, the delete retention policy is not enabled."

fi

下一步