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

如何用AzCopy复制JSON文件时同步含非JSON文件的Azure Blob结构?

解决方案:同步Azure Blob存储中不含JSON文件的虚拟目录结构

问题分析

你当前的AzCopy命令仅筛选复制.json文件,而Azure Blob存储的虚拟目录依赖Blob路径存在——如果某个目录下没有任何被复制的JSON文件,AzCopy会跳过该目录的创建,导致目标容器丢失这部分结构。要同步所有目录结构,需要主动在目标容器中创建对应路径的占位标识。

实现步骤

以下是整合到PowerShell调度脚本的完整方案:

1. 准备Azure认证与存储上下文

先确保脚本能访问源和目标存储账户,这里以托管身份认证为例(其他认证方式可替换对应逻辑):

# 用托管身份连接Azure(适用于Azure自动化、AKS等环境)
Connect-AzAccount -Identity

# 定义存储账户与容器信息
$sourceStorageAccount = "你的源存储账户名"
$destStorageAccount = "你的目标存储账户名"
$sourceContainer = "源容器名"
$destContainer = "目标容器名"

# 获取源、目标存储账户上下文
$sourceCtx = (Get-AzStorageAccount -Name $sourceStorageAccount).Context
$destCtx = (Get-AzStorageAccount -Name $destStorageAccount).Context

2. 提取源容器所有虚拟目录路径

遍历源容器的所有Blob,提取完整的目录路径并去重:

# 获取源容器内所有Blob
$allSourceBlobs = Get-AzStorageBlob -Container $sourceContainer -Context $sourceCtx

# 提取所有虚拟目录路径(去掉文件名部分)
$allDirectories = $allSourceBlobs.Name | ForEach-Object {
    if ($_ -match '^(.*)/[^/]+$') { $matches[1] }
} | Select-Object -Unique

3. 在目标容器创建占位Blob保留目录结构

Blob存储没有真实的目录,通过创建空的.placeholder占位Blob来标记目录存在:

foreach ($dir in $allDirectories) {
    $placeholderPath = "$dir/.placeholder"
    # 检查目标容器是否已存在该占位Blob,避免重复创建
    $existingBlob = Get-AzStorageBlob -Container $destContainer -Blob $placeholderPath -Context $destCtx -ErrorAction SilentlyContinue
    
    if (-not $existingBlob) {
        # 创建空的块Blob作为占位
        New-AzStorageBlob -Container $destContainer -Blob $placeholderPath -Context $destCtx -BlobType Block -ContentBytes @()
        Write-Host "已创建目录占位:$placeholderPath"
    }
}

4. 执行原有AzCopy命令复制JSON文件

继续使用你原来的AzCopy命令完成JSON文件的同步:

# 生成源、目标容器的SAS令牌(有效期1小时,按需调整权限和过期时间)
$sourceSas = New-AzStorageContainerSASToken -Name $sourceContainer -Context $sourceCtx -Permission r -ExpiryTime (Get-Date).AddHours(1)
$destSas = New-AzStorageContainerSASToken -Name $destContainer -Context $destCtx -Permission w -ExpiryTime (Get-Date).AddHours(1)

# 构建完整的容器URI
$sourceUri = "$((Get-AzStorageContainer -Name $sourceContainer -Context $sourceCtx).CloudBlobContainer.Uri.AbsoluteUri)?$sourceSas"
$destUri = "$((Get-AzStorageContainer -Name $destContainer -Context $destCtx).CloudBlobContainer.Uri.AbsoluteUri)?$destSas"

# 执行AzCopy复制JSON文件
azcopy copy "$sourceUri" "$destUri" --include-pattern '.json' --recursive=true

注意事项

  • 占位文件.placeholder不会影响业务逻辑,若不需要可在同步完成后批量删除(添加Remove-AzStorageBlob命令即可)。
  • 若脚本运行在非Azure环境,可替换Connect-AzAccount -Identity为Connect-AzAccount交互式登录,或使用服务主体认证。
  • 针对10000个目录结构,循环创建占位Blob的性能在可接受范围内,若需优化可考虑并行处理(如使用Start-Job)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 18:13:38