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

如何通过Airflow将GCS存储桶文件扁平化复制到Linux VM

GCS存储桶全量文件平级复制到Linux本地方案

需求对应效果

将GCS存储桶内所有嵌套路径下的文件,全部复制到Linux本地指定目录,丢弃原有目录层级,所有文件直接存放在目标目录的同一层级。
示例对应关系:

  • 源GCS桶:landing-gcp-cloud-12gd45
    • 源文件路径:gs://landing-gcp-cloud-12gd45/file1/file1.csv、gs://landing-gcp-cloud-12gd45/file2.csv、gs://landing-gcp-cloud-12gd45/file3/file3.txt
  • 本地目标目录:files
    • 落地后路径:files/file1.csv、files/file2.csv、files/file3.txt

前置准备

  • Linux虚拟机已完成gsutil工具的安装与鉴权配置,当前使用的账号拥有源存储桶的对象读取权限
  • 提前创建本地目标目录:
mkdir -p ./files

基础实现命令

直接执行以下shell命令即可完成复制,自动跳过虚拟目录,仅处理文件,自动剥离原路径保留纯文件名:

gsutil ls -r gs://landing-gcp-cloud-12gd45/** | while read -r gcs_obj; do
  # 过滤路径结尾带/的目录项,仅处理文件
  if [[ ! $gcs_obj =~ /$ ]]; then
    # 提取纯文件名,复制到本地目标目录
    gsutil cp "$gcs_obj" "./files/$(basename "$gcs_obj")"
  fi
done

重名文件兼容处理

如果存储桶内不同路径下存在同名文件,上述命令默认会覆盖目标目录下的同名文件。如果需要避免覆盖,可以使用带重名自动加序号的版本:

gsutil ls -r gs://landing-gcp-cloud-12gd45/** | while read -r gcs_obj; do
  if [[ ! $gcs_obj =~ /$ ]]; then
    filename=$(basename "$gcs_obj")
    target="./files/$filename"
    # 重名时自动追加数字后缀
    if [ -f "$target" ]; then
      count=1
      while [ -f "./files/${filename%.*}_${count}.${filename##*.}" ]; do
        count=$((count+1))
      done
      target="./files/${filename%.*}_${count}.${filename##*.}"
    fi
    gsutil cp "$gcs_obj" "$target"
  fi
done

结果校验

复制完成后执行以下命令查看目标目录文件列表,确认所有文件已平级存放:

ls ./files

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 16:45:14