如何一次性批量删除GS存储桶中的多个blob对象
GCS 批量删除指定对象实现方案
不需要手动写for循环逐次发起单对象删除请求,GCS官方工具/客户端库已经封装了原生批量删除能力,单次请求即可处理多个对象。注意你提供的blob路径前缀带有多余的/,GCS对象名不需要开头的斜杠,处理时先做截断即可。
方案1:Python 客户端实现(服务端批量请求)
使用GCS官方Python客户端的批量上下文管理器,所有删除操作会被打包为单个批量请求发送到服务端,不会逐个发起独立删除请求,代码示例:
from google.cloud import storage # 初始化客户端,替换为实际使用的存储桶名称 client = storage.Client() bucket = client.get_bucket("你的存储桶名称") # 持有的原始blob路径列表 blob_paths = [ '/26/06/2022/updwx/asr-mobile/1656287241091_hb.opus', '/26/06/2022/rrvjz/asr-mobile/1656287214693_hb.opus', '/26/06/2022/ledum/asr-mobile1656286851212_hb.opus', '/26/06/2022/atveh/asr-mobile1656286708558_hb.opus', '/25/06/2022/dlivh/asr-mobile/1656170162472_hb.opus', ] # 批量上下文内的操作会自动打包为批量请求 with client.batch(): for path in blob_paths: # 去掉路径开头的多余斜杠,得到真实GCS对象名 blob_name = path.lstrip("/") bucket.delete_blob(blob_name)
别看到代码里有for循环就觉得是逐个删——这个循环只是在本地往批量请求容器里塞待删除的对象条目,全程不会发单个删除请求,所有删除操作会在with块结束时打包成一个请求发给GCS服务端,完全符合一次性批量删除的要求。GCS单次批量请求最多支持100个对象,当前的对象数量远低于阈值,无需拆分。
方案2:命令行gsutil 一次性删除
如果是运维/脚本场景,直接使用gsutil原生命令即可,工具会自动调用批量删除接口,不需要手动写循环逻辑,执行命令如下:
# 替换为实际存储桶名称,所有对象路径已去掉开头的多余斜杠 gsutil rm \ gs://你的存储桶名称/26/06/2022/updwx/asr-mobile/1656287241091_hb.opus \ gs://你的存储桶名称/26/06/2022/rrvjz/asr-mobile/1656287214693_hb.opus \ gs://你的存储桶名称/26/06/2022/ledum/asr-mobile1656286851212_hb.opus \ gs://你的存储桶名称/26/06/2022/atveh/asr-mobile1656286708558_hb.opus \ gs://你的存储桶名称/25/06/2022/dlivh/asr-mobile/1656170162472_hb.opus
执行后会一次性返回所有对象的删除结果,不会逐个发起删除请求。
内容的提问来源于stack exchange,提问作者Ankit Singh
相关产品推荐
相关产品推荐

