如何将Azure存储账户数据复制到另一账户并按修改日期归档
实现Azcopy按文件最后修改日期分层复制Azure Blob存储文件
原Azcopy命令仅能镜像源容器的目录结构,无法直接按文件最后修改日期在目标容器创建年/月/日层级路径。要实现需求,需结合脚本枚举源文件并逐个复制到构造好的目标路径,以下提供两种环境的实现方案:
PowerShell 方案
适用于Windows环境,需依赖Azure PowerShell模块:
# 首次运行需安装Az模块(取消注释执行) # Install-Module -Name Az -Scope CurrentUser -Repository PSGallery -Force # 登录Azure账户 Connect-AzAccount # 配置存储账户与容器参数 $sourceStorageAccountName = "mysourceaccount" $sourceContainerName = "mycontainer" $destStorageAccountName = "mydestinationaccount" $destContainerName = "mycontainer" # 获取源存储账户上下文 $sourceContext = (Get-AzStorageAccount -Name $sourceStorageAccountName).Context # 枚举源容器内所有Blob $blobs = Get-AzStorageBlob -Container $sourceContainerName -Context $sourceContext # 遍历Blob并按修改日期分层复制 foreach ($blob in $blobs) { # 提取UTC最后修改日期的年、月、日(月份/日期补零) $lastModified = $blob.LastModified.UtcDateTime $year = $lastModified.Year $month = $lastModified.Month.ToString("00") $day = $lastModified.Day.ToString("00") # 构造目标Blob路径 $destBlobPath = "$year/$month/$day/$($blob.Name)" # 生成源和目标URL(需确保Azcopy已通过`azcopy login`获取权限,或URL包含SAS令牌) $sourceUrl = $blob.ICloudBlob.Uri.AbsoluteUri $destUrl = "https://$destStorageAccountName.blob.core.windows.net/$destContainerName/$destBlobPath" # 执行单个Blob复制 azcopy copy "$sourceUrl" "$destUrl" }
注意事项
- 确保Azcopy已配置权限:可通过
azcopy login登录Azure,或在源/目标URL后追加SAS令牌 - 大量文件复制时,可考虑添加并行处理逻辑,但需注意Azure存储账户的请求限额
- 若源文件包含特殊字符,需确保路径转义处理正确
Bash 方案
适用于Linux/WSL环境,需依赖Azure CLI:
# 首次运行需登录Azure(取消注释执行) # az login # 配置存储账户与容器参数 SOURCE_STORAGE_ACCOUNT="mysourceaccount" SOURCE_CONTAINER="mycontainer" DEST_STORAGE_ACCOUNT="mydestinationaccount" DEST_CONTAINER="mycontainer" # 枚举源容器内所有Blob的名称与UTC最后修改日期,循环处理 az storage blob list --account-name $SOURCE_STORAGE_ACCOUNT --container-name $SOURCE_CONTAINER --query "[].{name:name, lastModified:lastModified}" -o tsv | while read -r BLOB_NAME LAST_MODIFIED; do # 解析日期字符串,提取年、月、日 YEAR=$(echo $LAST_MODIFIED | cut -d'-' -f1) MONTH=$(echo $LAST_MODIFIED | cut -d'-' -f2) DAY=$(echo $LAST_MODIFIED | cut -d'T' -f1 | cut -d'-' -f3) # 构造目标Blob路径 DEST_BLOB_PATH="$YEAR/$MONTH/$DAY/$BLOB_NAME" # 生成源和目标URL(需确保Azcopy已登录或URL包含SAS令牌) SOURCE_URL="https://$SOURCE_STORAGE_ACCOUNT.blob.core.windows.net/$SOURCE_CONTAINER/$BLOB_NAME" DEST_URL="https://$DEST_STORAGE_ACCOUNT.blob.core.windows.net/$DEST_CONTAINER/$DEST_BLOB_PATH" # 执行单个Blob复制 azcopy copy "$SOURCE_URL" "$DEST_URL" done
注意事项
- 确保Azure CLI与Azcopy已安装并配置环境变量
- 若Blob数量极大,需使用
--max-items和--next-token参数分页枚举,避免输出溢出 - 如需使用本地时间而非UTC,需额外添加时区转换逻辑
内容的提问来源于stack exchange,提问作者NS2
相关产品推荐
相关产品推荐

