如何使用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
相关产品推荐
相关产品推荐

