Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Blob storage supports block blobs, append blobs, and page blobs. Block blobs are optimized for uploading large amounts of data efficiently. Блочные BLOB-объекты идеально подходят для хранения изображений, документов и других типов данных, для которых не используются операции произвольного чтения и записи. В этой статье объясняется, как работать с блочными блобами.
Предварительные условия
Для доступа к службе хранилища Azure требуется подписка Azure. Если у вас еще нет подписки, создайте бесплатную учетную запись Azure, прежде чем начинать работу.
Доступ к хранилищу Azure осуществляется с помощью учетной записи хранения. For this quickstart, create a storage account using the Azure portal, Azure PowerShell, or Azure CLI. Инструкции по созданию учетной записи хранения см. в статье Создайте учетную запись хранения.
Подготовка среды к работе с Azure CLI
Используйте среду Bash в Azure Cloud Shell. Для получения дополнительной информации см. Краткое руководство по Bash в Azure Cloud Shell.
Если вы предпочитаете выполнять справочные команды CLI локально, установите Azure CLI. Если вы работаете в Windows или macOS, Azure CLI можно запустить в контейнере Docker. Дополнительные сведения см. в статье Как запустить Azure CLI в контейнере Docker.
Если вы используете локальную установку, выполните вход в Azure CLI с помощью команды az login. Чтобы выполнить аутентификацию, следуйте инструкциям в окне терминала. Сведения о других возможностях, доступных при входе, см. в статье Вход с помощью Azure CLI.
Установите расширение Azure CLI при первом использовании, когда появится соответствующий запрос. Дополнительные сведения о расширениях см. в статье Использование расширений с Azure CLI.
Выполните команду az version, чтобы узнать установленную версию и зависимые библиотеки. Чтобы обновиться до последней версии, выполните команду az upgrade.
- Для работы с этой статьей требуется Azure CLI версии 2.0.46 или более поздней. Если вы используете Azure Cloud Shell, последняя версия уже установлена.
Authorize access to Blob storage
You can authorize access to Blob storage from the Azure CLI either with Microsoft Entra credentials or by using a storage account access key. Использование учетных данных Microsoft Entra рекомендуется, и в примерах этой статьи используется исключительно идентификатор Microsoft Entra ID.
Команды Azure CLI для операций с данными в хранилище BLOB-объектов поддерживают параметр --auth-mode
, что позволяет указать, как авторизовать определенную операцию. Set the --auth-mode
parameter to login to authorize with Microsoft Entra credentials. Только операции с данными в хранилище объектов Blob поддерживают параметр --auth-mode
. Операции управления, такие как создание группы ресурсов или учетной записи хранения, автоматически используют учетные данные Microsoft Entra для авторизации. Дополнительные сведения см. в разделе Выбор способа авторизации доступа к данным BLOB-объектов с помощью Azure CLI.
Выполните команду login
, чтобы открыть браузер и подключиться к своей подписке Azure.
az login
Создание контейнера
Все BLOB-данные хранятся в контейнерах, поэтому, чтобы загрузить данные, вам потребуется минимум один контейнер. При необходимости используйте следующий пример для создания контейнера хранилища. Дополнительные сведения см. в статье Управление контейнерами BLOB-объектов с помощью Azure CLI.
#!/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 с помощью Azure CLI см. в разделе Вход с помощью Azure CLI.
Upload blobs
Azure CLI предлагает команды, выполняющие операции с одним ресурсом или с несколькими ресурсами в зависимости от требований.
Чтобы отправить файл в блочный BLOB-объект, передайте необходимые значения параметров в команду az storage blob upload
. Укажите путь источника и имя файла с помощью параметра --file
и имя контейнера назначения с помощью параметра --container-name
. Также необходимо указать параметр --account-name
. Эта команда создает новый большой двоичный объект или перезаписывает исходный большой двоичный объект, если он уже существует.
С помощью команды az storage blob upload-batch
можно рекурсивно отправлять несколько больших двоичных объектов в контейнер хранилища. С помощью сопоставления шаблонов имен файлов UNIX можно указать диапазон файлов для передачи вместе с параметром --pattern
. Поддерживаются шаблоны *
, ?
, [seq]
и [!seq]
. Дополнительные сведения см. в документации Python по сопоставлению шаблонов имен файлов UNIX.
В следующем примере первая операция использует команду 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
List blobs
By default, the az storage blob list
command lists all blobs stored within a container. Для определения области поиска можно использовать различные подходы. There's no restriction on the number of containers or blobs a storage account can have. To potentially avoid retrieving thousands of blobs, it's a good idea to limit the amount of data returned.
Используйте параметр --prefix
, чтобы выбрать либо один известный файл, либо диапазон файлов, имена которых начинаются с определенной строки. В качестве части --prefix
параметра можно указать виртуальный каталог.
By default, only blobs are returned in a listing operation. In some scenarios, you might want to pass a value for the --include
parameter to return additional types of objects such as soft-deleted blobs, snapshots, and versions. Эти значения можно объединить для возврата нескольких типов объектов.
Этот --num-results
параметр можно использовать для ограничения количества блобов, возвращаемых из контейнера. A service limit of 5,000 is imposed on all Azure resources. Это ограничение обеспечивает извлечение таких объемов данных, с которыми удобно работать и которые не влияют на производительность. If the number of blobs returned exceeds either the --num-results
value or the service limit, a continuation token is returned. This token allows you to use multiple requests to retrieve any number of blobs. More information is available on Enumerating blob resources.
The following example shows several approaches used to provide a list of blobs. The first approach lists all blobs within a specified container. Второй подход использует --prefix
параметр для перечисления всех объектов Blob в контейнерах, начинающихся с указанного префикса. Третий подход использует --num-results
параметр для ограничения возвращаемых результатов и --show-next-marker
параметр для включения маркера продолжения в результаты. Когда маркер продолжения присутствует в результатах, он передается следующему вызову az storage blob list
для получения следующего набора результатов.
For more information, see the 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
Download a blob
Depending on your use case, you'll use either the az storage blob download
or az storage blob download-batch
command to download blobs. To download an individual blob, call the az storage blob download
command directly and pass values for the --container-name
, --file
, and --name
parameters. The blob is downloaded to the shell directory by default, but an alternate location can be specified. Операция завершится сбоем, если указанный путь не существует.
Чтобы рекурсивно скачивать несколько больших двоичных объектов из контейнера хранилища, используйте команду az storage blob download-batch
. Эта команда поддерживает сопоставление шаблонов имен файлов UNIX с параметром --pattern
. Поддерживаются шаблоны *
, ?
, [seq]
и [!seq]
. Дополнительные сведения см. в документации Python по сопоставлению шаблонов имен файлов UNIX.
В следующем примере кода показаны как одиночный, так и множественный подходы к скачиванию. Кроме того, предлагается упрощенный подход к поиску определенных файлов во всех контейнерах с помощью подстановочного знака. Так как в некоторых средах может быть много тысяч ресурсов, рекомендуется использовать --num-results
этот параметр.
For more information, see the az storage blob download and 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-хранилища. You can use metadata to store additional values with the resource. Значения метаданных предназначены для ваших собственных целей и не влияют на поведение ресурса.
Reading blob properties
Чтобы прочитать свойства или метаданные BLOB-объекта, необходимо сначала извлечь его из службы. Используйте команду az storage blob show
для извлечения свойств и метаданных BLOB-объекта, но не его содержимого. The following example retrieves a blob and lists its properties.
For more information, see the 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
и подайте массив пар "ключ-значение". For more information, see the az storage blob metadata reference.
For more information, see the az storage blob metadata reference.
The example below first updates and then commits a blob's metadata, and then retrieves it.
#!/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
Copy operations for blobs
There are many scenarios in which blobs of different types can be copied. Examples in this article are limited to block blobs. Azure CLI предлагает команды, выполняющие операции с одним ресурсом или с несколькими ресурсами в зависимости от требований.
To copy a specific blob, use the az storage blob copy start
command and specify values for source and destination containers and blobs. В качестве источника также можно указать универсальный код ресурса (URI), общую папку или подписанный URL-адрес (SAS).
You can also specify the conditions under which the blob will be copied. These conditions can be set for either the source or destination blob. Вы можете ссылаться на дату последнего изменения, данные тега или значение ETag. You may, for example, choose to copy blobs that haven't been recently modified to a separate container. For more information, see Specifying conditional headers for Blob service operations.
You can use the az storage blob copy start-batch
command to recursively copy multiple blobs between storage containers within the same storage account. Эта команда требует значения для параметров --source-container
и --destination-container
и может скопировать все файлы между источником и назначением. Как и другие пакетные команды CLI, эта команда поддерживает сопоставление шаблонов имен файлов UNIX с параметром --pattern
. Поддерживаются шаблоны *
, ?
, [seq]
и [!seq]
. Дополнительные сведения см. в документации Python по сопоставлению шаблонов имен файлов UNIX.
Примечание.
Для повышения удобства и производительности рассмотрите возможность использования AzCopy, особенно при копировании BLOB-объектов между учетными записями хранения. AzCopy — это утилита командной строки, которую можно использовать для копирования блобов или файлов в учетную запись хранения или из нее. Узнайте больше о том, как начать работу с AzCopy.
For more information, see the az storage blob copy reference.
В примере кода ниже приводится пример одной и нескольких операций копирования. Так как в некоторых средах может быть много тысяч ресурсов, рекомендуется использовать --num-results
этот параметр. В первом примере объект BLOB secret-town-road.png копируется из контейнера 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
Snapshot blobs
Any leases associated with the base blob don't affect the snapshot. You can’t acquire a lease on a snapshot. Read more about Blob snapshots. For more information, see the az storage blob snapshot reference.
The following sample code retrieves a blob from a storage container and creates a snapshot of it.
#!/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
Set blob tier
При изменении уровня BLOB-объекта он и все его данные перемещаются на целевой уровень. Вы можете изменить уровень между горячим, холодным и архивным с помощью az storage blob set-tier
команды.
В зависимости от требований вы также можете использовать операцию Copy Blob для копирования BLOB-объекта с одного уровня на другой. Операция Copy Blob создает новый объект Blob на нужном уровне, оставляя исходный объект Blob на прежнем уровне.
Изменение уровней с холодного или горячего на архив происходит почти сразу. After a blob is moved to the archive tier, it's considered to be offline and can't be read or modified. Before you can read or modify an archived blob's data, you'll need to rehydrate it to an online tier. Read more about Blob rehydration from the archive tier.
For more information, see the az storage blob set-tier reference.
The following sample code sets the tier to hot for a single, named blob within the archive
container.
#!/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
Operations using blob tags
Blob index tags make data management and discovery easier. Blob index tags are user-defined key-value index attributes that you can apply to your blobs. После настройки вы сможете классифицировать и находить объекты в отдельном контейнере или во всех контейнерах. Ресурсы BLOB-объектов можно динамически классифицировать, обновляя их теги индекса без изменений в организации контейнеров. Этот подход предлагает гибкий способ обеспечения соответствия меняющимся требованиям к данным. Метаданные и тег индекса можно использовать одновременно. Дополнительные сведения об тегах индекса см. в статье Управление данными BLOB-объектов Azure и их поиск с помощью тегов индекса BLOB-объектов.
Tip
В приведенном ниже примере кода используется сопоставление шаблонов для получения текста из XML-файла, имеющего известную структуру. The example is used to illustrate a simplified approach for adding blob tags using basic Bash functionality. The use of an actual data parsing tool is always recommended when consuming data for production workloads.
The following example illustrates how to add blob index tags to a series of blobs. В этом примере считываются данные из XML-файла и используются для создания тегов индекса для нескольких BLOB-объектов. Чтобы использовать образец кода, создайте локальный файл blob-list.xml в каталоге C:\temp. Данные XML предоставлены ниже.
For more information, see the az storage blob set-tier reference.
<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. It then iterates through the remaining lines and creates tags for each blob referenced by a File
node.
#!/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
Delete blobs
С помощью команд az storage blob delete
и az storage blob delete-batch
можно удалить один BLOB-объект или ряд BLOB-объектов. При удалении нескольких BLOB-объектов можно использовать условные операции, циклы или другие методы автоматизации, как показано в примерах ниже.
Предупреждение
Running the following examples may permanently delete blobs. Компания Microsoft рекомендует включить мягкое удаление контейнеров, чтобы защитить контейнеры и BLOB-объекты от случайного удаления. For more info, see Soft delete for containers.
В следующем образце кода приведен пример как отдельных, так и пакетных операций удаления. The first example deletes a single, named blob. Во втором примере показано использование логических операций в Bash для удаления нескольких BLOB-объектов. В третьем примере используется команда delete-batch
для удаления всех BLOB-объектов в формате bennett-x, кроме 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
In some cases, it's possible to retrieve blobs that have been deleted. If your storage account's soft delete data protection option is enabled, passing the --include d
parameter returns blobs that were deleted within the account's retention period. To learn more about soft delete, refer to thee Soft delete for blobs article.
Use the following examples to retrieve a list of blobs deleted within container's associated retention period. В первом примере отображается список недавно удаленных 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}"
Restore a deleted blob
As mentioned in the List blobs section, you can configure the soft delete data protection option on your storage account. Если такая защита данных включена, то вы сможете восстановить контейнеры, удаленные в течение связанного периода хранения. You may also use versioning to maintain previous versions of your blobs for each recovery and restoration.
If blob versioning and blob soft delete are both enabled, then modifying, overwriting, deleting, or restoring a blob automatically creates a new version. The method you'll use to restore a deleted blob depends upon whether versioning is enabled on your storage account.
The following code sample restores all soft-deleted blobs or, if versioning is enabled, restores the latest version of a blob. It first determines whether versioning is enabled with the az storage account blob-service-properties show
command.
Если управление версиями включено, az storage blob list
команда извлекает список всех уникальных именованных версий BLOB-объектов. Next, the blob versions on the list are retrieved and ordered by date. If no versions are found with the isCurrentVersion
attribute value, the az storage blob copy start
command is used to make an active copy of the blob's latest version.
If versioning is disabled, the az storage blob undelete
command is used to restore each soft-deleted blob in the container.
Before you can follow this example, you'll need to enable soft delete on at least one of your storage accounts. To learn more about the soft delete data protection option, refer to the Soft delete for blobs article or the az storage blob undelete reference.
#!/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