使用 Azure CLI 管理區塊 Blob
Blob 儲存體支援區塊 Blob、附加 Blob 和分頁 Blob。 區塊 Blob 已最佳化,可以有效率地上傳大量資料。 區塊 Blob 很適合用來儲存影像、文件,以及其他不受隨機讀取和寫入作業影響的資料類型。 本文說明如何使用區塊 Blob。
必要條件
若要存取 Azure 儲存體,您需要有 Azure 訂用帳戶。 如果您還沒有訂用帳戶,請先建立免費帳戶,再開始操作。
對 Azure 儲存體的所有存取都是透過儲存體帳戶進行。 在本快速入門中,使用 Azure 入口網站、Azure PowerShell 或 Azure CLI 建立儲存體帳戶。 如需建立儲存體帳戶的協助,請參閱建立儲存體帳戶。
備妥環境以使用 Azure CLI
在 Azure Cloud Shell 中使用 Bash 環境。 如需詳細資訊,請參閱 Azure Cloud Shell 中的 Bash 快速入門。
若要在本地執行 CLI 參考命令,請安裝 Azure CLI。 若您在 Windows 或 macOS 上執行,請考慮在 Docker 容器中執行 Azure CLI。 如需詳細資訊,請參閱〈如何在 Docker 容器中執行 Azure CLI〉。
如果您使用的是本機安裝,請使用 az login 命令,透過 Azure CLI 來登入。 請遵循您終端機上顯示的步驟,完成驗證程序。 如需其他登入選項,請參閱使用 Azure CLI 登入。
出現提示時,請在第一次使用時安裝 Azure CLI 延伸模組。 如需擴充功能詳細資訊,請參閱使用 Azure CLI 擴充功能。
執行 az version 以尋找已安裝的版本和相依程式庫。 若要升級至最新版本,請執行 az upgrade。
- 本文需要 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 download
或 az 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 download 和 az 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 元素,並為 Name 和 Type 值建立變數。 然後,其會逐一查看其餘程式行,並針對 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 delete
和 az storage blob delete-batch
命令,刪除單一 Blob 或一系列的 Blob。 在刪除多個 Blob 時,您可以使用條件式作業、迴圈或其他自動化,如下列範例所示。
警告
執行下列範例可能會永久刪除 Blob。 Microsoft 建議啟用容器虛刪除,以防止容器和 Blob 遭到意外刪除。 如需詳細資訊,請參閱容器的虛刪除。
下列範例程式碼會提供個別和批次刪除作業的範例。 第一個範例會刪除單一具名 Blob。 第二個範例會說明如何使用 Bash 中的邏輯作業來刪除多個 Blob。 第三個範例會使用 delete-batch
命令來刪除格式為 bennett-x 的所有 Blob,但 bennett-2 除外。
如需詳細資訊,請參閱 az storage blob delete 和 az 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