如何批量下载Azure存储容器各级目录的index.json并按目录重命名
问题与解决方案
目标
- 下载Azure Storage容器中所有层级目录(含子目录、孙目录等)下的所有
index.json文件; - 将每个
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,无法覆盖子目录,且操作繁琐:
- 生成顶层目录列表(无法获取子目录)
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---" } ]
- 手动排除不需要的目录(易出错,且遇到无
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
- 遍历目录下载并重命名(仅能处理顶层目录,遗漏子目录文件)
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文件,自动提取目录名并重命名下载:
- 递归列出容器中所有
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
- 遍历文件列表,提取目录名并下载重命名
# 创建本地存储目录 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
相关产品推荐
相关产品推荐

