You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何批量下载Azure存储容器各级目录的index.json并按目录重命名

问题与解决方案

目标

  1. 下载Azure Storage容器中所有层级目录(含子目录、孙目录等)下的所有index.json文件;
  2. 将每个index.json按其所在的源目录名称重命名。

Azure Blob结构示例

container/

  product-1/
    articles/
      page-1.html
      page-2.html
    fonts/
      fontawesome.ttf
    images/
      product-image-1.png
      product-image-2.png
    node-modules/
      ...
    styles/
      style.css
      style.js
    index.html
    index.json

  product-2/
    articles/
      page-3.html
      page-4.html
    fonts/
      fontawesome.ttf
    images/
      product-image-3.png
      product-image-4.png
    node-modules/
      ...

    product-2-a/
      articles/
        page-3.html
        page-4.html
      fonts/
        fontawesome.ttf
      images/
        product-image-3.png
        product-image-4.png
      node-modules/
        ...
      styles/
        style.css
        style.js
      index.html
      index.json

    styles/
      style.css
      style.js
    index.html
    index.json

  index.html

期望本地结果

localIndexes/
  product-1.json
  product-2.json
  product-2-a.json

当前低效方案

当前方案仅能获取顶层目录的index.json,无法覆盖子目录,且操作繁琐:

  1. 生成顶层目录列表(无法获取子目录)
az storage fs directory list -f wwwroot --recursive false --account-name $storageAccountName --account-key $accountKey > dirs.json

生成的dirs.json仅包含顶层目录,示例内容:

[
  {
    "contentLength": 0,
    "etag": "123",
    "group": "$abc",
    "isDirectory": true,
    "lastModified": "2022-01-13T23:20:19",
    "name": "product-1",
    "owner": "$abc",
    "permissions": "abc---"
  },
  {
    "contentLength": 0,
    "etag": "345",
    "group": "$abc",
    "isDirectory": true,
    "lastModified": "2022-01-13T23:20:19",
    "name": "product-2",
    "owner": "$abc",
    "permissions": "abc---"
  },
  {
    "contentLength": 0,
    "etag": "456",
    "group": "$abc",
    "isDirectory": true,
    "lastModified": "2022-01-13T23:20:19",
    "name": "styles",
    "owner": "$abc",
    "permissions": "abc---"
  }
]
  1. 手动排除不需要的目录(易出错,且遇到无index.json的目录时脚本会崩溃)
for excludeDir in css \
fonts \
images \
js \
node_modules \
styles ; do
jq --arg excludeDir $excludeDir '[.[] | select(.name != $excludeDir)]' dirs.json > temp.tmp && mv temp.tmp dirs.json
done
  1. 遍历目录下载并重命名(仅能处理顶层目录,遗漏子目录文件)
jq -r '.[] | "\(.name)"' dirs.json |
    while IFS="|" read -r name; do

for dir in $name ; do
blobName=`echo $name | tr -d '\r'`
az storage blob download --container-name $containerName --file localIndexes/$blobName.json --name $blobName/index.json --account-key $accountKey --account-name $storageAccountName
done

 done

最终结果缺失子目录的product-2-a.json:

localIndexes/
  product-1.json
  product-2.json

通配符尝试失败记录

尝试使用az storage fs file download的通配符模式未成功:

az storage fs file download -p */index.json -f wwwroot --account-name $storageAccountName --account-key $storageAccountName

az storage fs file download -p /**/index.json -f wwwroot --account-name $storageAccountName --account-key $storageAccountName

az storage fs file download -p /--pattern index.json -f wwwroot --account-name $storageAccountName --account-key $storageAccountName

可行解决方案

通过递归查找所有index.json文件,自动提取目录名并重命名下载:

  1. 递归列出容器中所有index.json文件并保存为JSON
az storage blob list --container-name $containerName --account-name $storageAccountName --account-key $accountKey --recursive --query "[?ends_with(name, '/index.json')]" > index_files.json
  1. 遍历文件列表,提取目录名并下载重命名
# 创建本地存储目录
mkdir -p localIndexes

# 遍历每个index.json文件
jq -r '.[] | "\(.name)"' index_files.json | while read blob_path; do
  # 从Blob路径中提取目录名称(如"product-2/product-2-a/index.json"提取为"product-2-a")
  dir_name=$(basename $(dirname "$blob_path"))
  # 下载文件并重命名为目录名+.json
  az storage blob download --container-name $containerName --account-name $storageAccountName --account-key $accountKey --name "$blob_path" --file "localIndexes/${dir_name}.json"
done

方案优势

  • 自动递归查找所有层级的index.json,不会遗漏子目录文件
  • 无需手动排除目录,自动过滤仅包含index.json的目录
  • 直接从Blob路径提取目标目录名,避免手动维护目录列表的繁琐操作

内容的提问来源于stack exchange,提问作者hcdocs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 15:15:37