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

如何使用Google Cloud Storage Blob对象递归复制子目录至父目录

递归移动Google Cloud Storage子文件夹内容到父文件夹

需要将Google Cloud Storage(GCS)中子文件夹的所有内容递归移动到父文件夹,已有单个文件移动的可行代码,但递归场景下遇到配置问题。

单个文件移动的可用代码

client = storage.Client()
bucket = client.get_bucket(BUCKET_NAME)

source_path = Path(parent_dir, sub_folder, filename).as_posix()
source_blob = bucket.blob(source_path)

dest_path = Path(parent_dir, filename).as_posix()
bucket.copy_blob(source_blob, bucket, dest_path)

遇到的错误

尝试直接将dest_path设为"parent_dir"时,触发404错误:

google.api_core.exceptions.NotFound: 404 POST https://storage.googleapis.com/storage/v1/b/bucket/o/parent_dir%2Fsubfolder/copyTo/b/geo-storage/o/parent_dir?prettyPrint=false: No such object: geo-storage/parent_dir/subfolder

替代方案(但倾向不使用)

使用gsutil可实现递归复制,命令如下:

os.system(f"gsutil cp -r gs://bucket/parent_dir/subfolder/* gs://bucket/parent_dir")

基于Blob对象的递归移动实现

要通过Blob对象完成递归移动,需先遍历子文件夹下所有Blob,再逐个处理路径映射与移动操作:

from google.cloud import storage
from pathlib import Path

client = storage.Client()
bucket = client.get_bucket(BUCKET_NAME)

# 定义父文件夹与子文件夹路径
parent_dir = "parent_dir"
sub_folder = "subfolder"
source_prefix = f"{parent_dir}/{sub_folder}/"

# 递归遍历子文件夹下的所有Blob对象
blobs = bucket.list_blobs(prefix=source_prefix)

for blob in blobs:
    # 跳过GCS虚拟文件夹本身(仅为前缀标识,无实际内容)
    if blob.name == source_prefix:
        continue
    
    # 计算目标路径:移除原路径中的子文件夹前缀
    relative_path = blob.name[len(source_prefix):]
    dest_path = Path(parent_dir, relative_path).as_posix()
    
    # 复制Blob到目标路径
    bucket.copy_blob(blob, bucket, dest_path)
    # 删除源Blob,完成移动操作
    blob.delete()

关键说明

  • GCS不存在真实文件夹,所有对象均为带前缀的Blob,需通过prefix参数遍历子文件夹下的所有内容
  • GCS无原生移动API,移动操作本质为复制+删除源文件
  • 需跳过名称与源前缀完全一致的虚拟文件夹Blob(通常由gsutil等工具创建)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 06:40:37