【问题标题】:Download a list of specific files from Azure Blob从 Azure Blob 下载特定文件的列表
【发布时间】:2021-11-23 06:37:57
【问题描述】:

我从 Azure Blob 容器下载文件时遇到问题。这并不像看起来那么微不足道。我看到了很多关于如何下载一个文件的示例,但是如果您需要下载大量文件,就会出现问题。

问题定义:

  • 我有一个 Azure Blob 容器,其中包含大约 30k 个文件
  • 同时,我有一个本地的确切文件名列表(大约 300 个文件),我想从该 Azure Blob 容器下载(即,我需要有选择地下载一大堆文件,由他们姓名)

我知道所有这些文件都存在于给定的 blob 中。所以,我需要一种方法来遍历文件列表并从 blob 下载它们。

我尝试了什么:

  • 我尝试了“azcopy copy”命令。如果您需要将一个或多个文件从 blob 复制到本地磁盘,它可以正常工作,但您无法将大量文件作为参数传递给下载这些文件
  • 尝试搜索可以执行相同操作的 PowerShell 示例,但没有成功

请指教。

【问题讨论】:

    标签: azure powershell azure-blob-storage azcopy


    【解决方案1】:

    请尝试以下方法。它使用Get-AzStorageBlobContent Cmdlet。

    这个想法是有一个您希望下载的 blob 数组,然后遍历该数组并为每个项目调用此 Cmdlet。

    $accountName = "account-name"
    $accountKey = "account-key"
    $containerName = "container-name"
    $context = New-AzStorageContext -StorageAccountName $accountName -StorageAccountKey $accountKey
    $destination = "C:\temp"
    
    $blobNames = @("blob1.txt", "blob2.txt", "blob3.txt", "blob4.txt")
    
    For ($i=0; $i -lt $blobNames.Length; $i++) {
        $blob = $blobNames[$i]
        Write-Host "Downloading $blob. Please wait."
        Get-AzStorageBlobContent -Blob $blob -Container $containerName -Destination $destination -Context $context -Verbose
    }
    

    【讨论】:

    • 这可能有效。但是,我不想指定所有 300 多个文件名并将它们写入 $blobNames 变量。鉴于我有一个“list.txt”文件,其中列出了所有这些文件(用分号分隔),我如何从该文件中读取。基本上,我想从文本文件中一个一个地读取文件名并下载它们。
    • 我想如果你在 PowerShell 中搜索读取文本文件,你会找到一些方法来完成这个。
    • 我不是 PS 方面的专家,但谢谢...
    • 好的,这有效:$blobNames = Get-Content $destination\list.txt 谢谢大家!
    【解决方案2】:

    您是否尝试过“Azure 存储资源管理器”软件? 多亏了它,我才能从 blob 存储中下载整个文件夹。

    如果 blob 容器中的数据位于文件夹中,只需右键单击该文件夹 > 下载。

    如果文件直接位于容器的根目录(未存储在子文件夹中),您必须使用“全选 > 选择缓存中的所有文件”选项选择所有文件,然后单击“下载”。

    【讨论】:

    • OP 不想下载整个文件夹,而是从容器中下载选定的 blob 列表。
    • 那么该解决方案也应该可以工作,因为 Azure 存储资源管理器允许您按文件名(或其他更复杂的过滤器)进行搜索。
    • 如果我没记错的话,存储资源管理器不允许您按 blob 名称搜索。它允许基于“前缀”的搜索,但这是完全不同的。源容器也有 30000 个 blob。存储资源管理器不会搜索整个容器。
    • 你是对的,它是不同的。但是,如果您必须按名称逐个搜索 300 个文件,会发生什么变化?如果他以编程方式进行,他是否必须声明一个包含 300 个字符串的数组?如果 30k 的文件没有命名约定,那他就得一个一个地去做。
    • OP提到需要下载的blob列表已经有了。
    【解决方案3】:
    $accountName = "account-name"
    $accountKey = "account-key"
    $containerName = "container-name"
    $context = New-AzStorageContext -StorageAccountName $accountName -StorageAccountKey $accountKey
    $destination = "C:\temp"
    
    $blobNames = Get-Content $destination\list.txt
    
    For ($i=0; $i -lt $blobNames.Length; $i++) {
        $blob = $blobNames[$i]
        Write-Host "Downloading $blob. Please wait."
        Get-AzStorageBlobContent -Blob $blob -Container $containerName -Destination $destination -Context $context -Verbose
    }
    

    考虑到包含您需要下载的 blob 的文件名列表的文本文件位于“$destination”目录中(但可以是您 PC 上的任何目录),它会像一个魅力一样工作. p.s.,文件只需要列为一列(由插入符号返回分隔,即每个文件名末尾的“\n”)。 感谢@Gaurav Mantri 的解决方案。

    【讨论】:

      猜你喜欢
      • 2019-12-19
      • 2017-08-20
      • 2021-01-04
      • 2018-04-13
      • 1970-01-01
      • 2021-12-08
      • 2018-09-27
      相关资源
      最近更新 更多