【发布时间】:2017-11-30 08:44:08
【问题描述】:
是否可以列出容器上上次修改日期大于指定日期的所有 blob。
我有一个包含数百万 blob 的容器,并且想要将这些 blob 复制到备份容器中,但不想遍历所有 blob 检查每个 blob 的上次修改日期。
【问题讨论】:
-
参见here 以及
标签: c# azure azure-blob-storage
是否可以列出容器上上次修改日期大于指定日期的所有 blob。
我有一个包含数百万 blob 的容器,并且想要将这些 blob 复制到备份容器中,但不想遍历所有 blob 检查每个 blob 的上次修改日期。
【问题讨论】:
标签: c# azure azure-blob-storage
是否可以列出上次修改的容器上的所有 blob 日期大于指定日期。
截至今天,不可能这样做。 Blob 服务不提供查询功能。当您列出 Blob 时,Blob 服务将返回一个按 Blob 名称排序的列表。
不是现在,但如果您需要此功能,您可能希望通过在名称前加上年、月和日期来按日期组织 blob。然后,您可以要求 blob 服务返回以特定前缀开头的 blob 名称。如果你使用Azure App Service,请查看 Azure 应用服务的诊断数据如何存储在 blob 容器中。它确实按年、月和日期作为前缀。
【讨论】:
可以使用 Powershell。请看下面的sn-p。
$StorageAccountName = "AccountName"
$StorageAccountKey = "What_ever_your_key_is_123asdf5524523A=="
$Context = New-AzureStorageContext -StorageAccountName $StorageAccountName -StorageAccountKey $StorageAccountKey
$ContainerName = "Container"
$Blobs = Get-AzureStorageBlob -Container $ContainerName -Context $Context `
| Where-Object{$_.LastModified.DateTime -gt (Get-Date).Date}
上述命令将从午夜开始获取当天的 blob。
然后您可以使用Get-Date cmdlet 上的函数进一步缩小时间范围,如下所示。
$Blobs = Get-AzureStorageBlob -Container $ContainerName -Context $Context `
| Where-Object{$_.LastModified.DateTime -gt ((Get-Date).Date).AddDays(-1)}
您也可以通过管道传递到Sort-Object cmdlet 来对任何属性进行排序(我在下面的示例中按日期排序)。
$Blobs = Get-AzureStorageBlob -Container $ContainerName -Context $Context `
| Where-Object{$_.LastModified.DateTime -gt (Get-Date).Date.AddDays(-1)} `
| Sort-Object -Property Date
【讨论】:
Get-AzureStorageBlob -Container $ContainerName -Context $Context 存储在自己的变量中,然后使用该变量通过管道传输到Where-Object{$_.LastModified.DateTime -gt (Get-Date).Date}。否则,如果对Get-AzureStorageBlob 的调用需要很长时间才能运行并且您发现您使用了错误的日期,您将自责。
如果您查看REST API documentation,则没有过滤日期/时间的参数。因此,这样做的唯一方法是列出所有 blob,然后按您的标准过滤(这也由 Mustafa Salmans 回答完成),或者按照 Gaurav Mantri 已经写的那样按日期组织 blob。
【讨论】:
这就是我在 Java 中的做法。它打印在最后一天修改的 blob。我确信 C# 等效项非常相似:
BlobServiceClient blobServiceClient = new BlobServiceClientBuilder().endpoint("https://youraccount.blob.core.windows.net").sasToken("yourtoken").buildClient();
BlobContainerClient blobContainerClient = blobServiceClient.getBlobContainerClient("yourcontainer");
BlobListDetails details = new BlobListDetails().setRetrieveMetadata(true);
ListBlobsOptions options = new ListBlobsOptions().setPrefix("yourprefix").setDetails(details);
blobContainerClient.listBlobs(options, null).stream().filter(blob -> blob.getProperties().getLastModified().isAfter(OffsetDateTime.now().minusDays(1))).forEach(blob -> System.out.printf("Name: %s %s%n", blob.getName(), blob.getProperties().getLastModified()));
【讨论】: