请求:构建Azure Pipeline清除Synapse Bronze/Silver存储空文件
解决方案:Azure Pipeline 删除Synapse存储中的空文件
核心逻辑
遍历Bronze、Silver存储容器下的ATTRACT、OUTSTANDING、OK、KO目录及其所有子目录,识别并删除大小为0的空文件,保留非空文件及原有目录结构。
Pipeline 配置方案
以下提供两种主流实现方式,可根据Pipeline代理环境选择:
方式1:使用Azure CLI(Ubuntu代理)
适用于Ubuntu虚拟机作为代理的Pipeline,基于Bash编写:
trigger: none # 可选:设置定时触发(每天凌晨2点执行) # schedule: # - cron: '0 2 * * *' # displayName: 每日凌晨清理空文件 # branches: # include: # - main pool: vmImage: 'ubuntu-latest' variables: # 替换为你的存储账户名称 storageAccountName: 'your-storage-account' # 目标容器列表 targetContainers: 'Bronze,Silver' # 目标二级目录列表 targetDirs: 'ATTRACT,OUTSTANDING,OK,KO' steps: - task: AzureCLI@2 displayName: 遍历并删除空文件 inputs: # 替换为你的Azure资源管理器服务连接名称 azureSubscription: 'your-azure-service-connection' scriptType: 'bash' scriptLocation: 'inlineScript' inlineScript: | # 分割容器和目录列表 IFS=',' read -ra CONTAINERS <<< "$(targetContainers)" IFS=',' read -ra DIRS <<< "$(targetDirs)" for container in "${CONTAINERS[@]}"; do echo "=== 开始处理容器: $container ===" for dir in "${DIRS[@]}"; do echo "--- 处理目录: $dir ---" # 递归列出当前目录下所有空文件 az storage blob list \ --account-name $(storageAccountName) \ --container-name "$container" \ --prefix "$dir/" \ --recursive \ --query "[?properties.contentLength == 0].name" \ --output tsv | while read blob_path; do if [ -n "$blob_path" ]; then echo "删除空文件: $blob_path" az storage blob delete \ --account-name $(storageAccountName) \ --container-name "$container" \ --name "$blob_path" fi done done done
方式2:使用PowerShell(Windows代理)
适用于Windows虚拟机作为代理的Pipeline,基于Az.Storage模块实现:
trigger: none # 可选:设置定时触发 # schedule: # - cron: '0 2 * * *' # displayName: 每日凌晨清理空文件 # branches: # include: # - main pool: vmImage: 'windows-latest' variables: storageAccountName: 'your-storage-account' targetContainers: 'Bronze,Silver' targetDirs: 'ATTRACT,OUTSTANDING,OK,KO' steps: - task: AzurePowerShell@5 displayName: 遍历并删除空文件 inputs: azureSubscription: 'your-azure-service-connection' ScriptType: 'InlineScript' Inline: | $containers = "$(targetContainers)".Split(',') $dirs = "$(targetDirs)".Split(',') $storageAccount = Get-AzStorageAccount -Name "$(storageAccountName)" $storageContext = $storageAccount.Context foreach ($container in $containers) { Write-Host "=== 开始处理容器: $container ===" foreach ($dir in $dirs) { Write-Host "--- 处理目录: $dir ---" # 获取当前目录下所有空文件(递归) $emptyBlobs = Get-AzStorageBlob -Container $container -Prefix "$dir/" -Recursive -Context $storageContext | Where-Object { $_.Length -eq 0 } if ($emptyBlobs.Count -gt 0) { Write-Host "找到 $($emptyBlobs.Count) 个空文件,开始删除..." $emptyBlobs | Remove-AzStorageBlob -Context $storageContext } else { Write-Host "未找到空文件" } } } azurePowerShellVersion: 'LatestVersion'
关键注意事项
- 权限配置:确保Pipeline使用的Azure服务连接(Azure资源管理器类型)拥有目标存储账户的
Storage Blob Data Contributor角色权限,否则无法执行删除操作。 - 测试验证:首次运行前,可注释掉删除命令,仅保留空文件列表输出,确认识别的文件符合预期后再执行删除。
- 性能优化:若存储中文件量极大,可考虑分批次处理或增加代理资源配置,避免超时。
- 目录保留:脚本仅删除空文件,不会删除空目录,符合保留目录结构的需求。
内容的提问来源于stack exchange,提问作者azoben
相关产品推荐
相关产品推荐

