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

请求:构建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'

关键注意事项

  1. 权限配置:确保Pipeline使用的Azure服务连接(Azure资源管理器类型)拥有目标存储账户的Storage Blob Data Contributor角色权限,否则无法执行删除操作。
  2. 测试验证:首次运行前,可注释掉删除命令,仅保留空文件列表输出,确认识别的文件符合预期后再执行删除。
  3. 性能优化:若存储中文件量极大,可考虑分批次处理或增加代理资源配置,避免超时。
  4. 目录保留:脚本仅删除空文件,不会删除空目录,符合保留目录结构的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 06:33:36