删除非空谷歌桶的快速方法?

fre*_*rik 18 google-cloud-storage

这是我唯一的选择还是更快的方式?

# Delete contents in bucket (takes a long time on large bucket)
gsutil -m rm -r gs://my-bucket/*

# Remove bucket
gsutil rb gs://my-bucket/
Run Code Online (Sandbox Code Playgroud)

Tra*_*rla 22

在删除存储桶之前,存储桶必须是空的.因此,在删除存储桶之前,必须删除它包含的所有对象.

您可以使用gsutil rm -r(文档)执行此操作.只是不要传递*通配符,它​​会在删除所有对象后删除存储桶.

gsutil -m rm -r gs://my-bucket
Run Code Online (Sandbox Code Playgroud)

Google云端存储对象列表最终是一致的,在桶列表返回0个对象之前,桶删除无法成功.因此,有时在删除所有对象后,存储桶可能需要一些时间才能显示为空.在这种情况下,您可以在尝试删除存储桶时获得Bucket Not Empty错误(或在UI的情况下'Bucket Not Ready').

解决方案是重试删除,并gsutil具有内置的重试逻辑.

  • 我将这个答案标记为正确答案,但我真的觉得应该有一个更简单的方法来删除一个桶及其所有内容.现在,在删除存储桶本身之前,没有办法避免滚动存储桶中的所有内容并逐个删除所有对象. (6认同)

jte*_*ace 19

另一种选择是在存储桶上启用生命周期管理.您可以指定Age0天,然后等待几天.应删除所有对象.

  • 'echo'{“ rule”:[{“ action”:{“ type”:“ Delete”},“ condition”:{“ age”:0}}]}'> tmp.json; gsutil生命周期设置tmp.json gs:// MY-BUCKET` (5认同)
  • 我是第二个!我需要删除一个桶中的211TB,递归rm需要多天,我没有留下任何凹痕.这很快就成功了. (4认同)

Tad*_*nis 7

这是值得总结和指出的。

如果您有大量(TB)数据,则使用 gsutil rm 删除速度会很慢

gsutil -m rm -r gs://my-bucket
Run Code Online (Sandbox Code Playgroud)

但是,您可以指定存储桶的到期时间,并让 GCS 为您完成工作。创建fast-delete.json政策:

{
   "rule":[
      {
         "action":{
            "type":"Delete"
         },
         "condition":{
            "age":0
         }
      }
   ]
}
Run Code Online (Sandbox Code Playgroud)

然后申请

gsutil lifecycle set fast-delete.json gs://MY-BUCKET
Run Code Online (Sandbox Code Playgroud)

谢谢@jterrace 和@Janosch


Che*_*ge 6

使用Python客户端,您可以使用以下命令在脚本中强制删除:

bucket.delete(force=True)
Run Code Online (Sandbox Code Playgroud)

用您当前的语言尝试类似的事情。

讨论这个的Github线程


Rav*_*ila 6

使用它来设置适当的生命周期规则。例如等待一天。

https://cloud.google.com/storage/docs/gsutil/commands/lifecycle
Run Code Online (Sandbox Code Playgroud)

示例 (复制粘贴前请仔细阅读)

gsutil lifecycle set [LIFECYCLE_CONFIG_FILE] gs://[BUCKET_NAME]
Run Code Online (Sandbox Code Playgroud)

示例 (复制粘贴前请仔细阅读)

{
  "rule":
  [
    {
      "action": {"type": "Delete"},
      "condition": {"age": 1}
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

然后删除存储桶。

这将异步删除数据,因此您不必让某些后台作业一直运行。


Chr*_*den 5

我使用三种技术对删除进行了基准测试:

  • 存储传输服务:1200 - 1500/秒
  • gcloud storage rm:520/秒
  • gsutil -m rm:240/秒

大赢家是存储传输服务。要使用它删除文件,您需要一个空的源存储桶(或存储桶中的文件夹),然后将其复制到您希望为空的目标存储桶(或该存储桶中的文件夹)。

如果使用 GUI,请在高级传输选项对话框中选择此项目符号: 高级传输选项

您还可以从 CLI 创建并运行作业。此示例假设您有权访问gs://bucket1/empty/(其中没有对象)并且您想要从中删除所有对象gs://bucket2/

gcloud transfer jobs create \
gs://bucket1/empty/ gs://bucket2/ \
--delete-from=destination-if-unique \
--project my-project
Run Code Online (Sandbox Code Playgroud)

如果您希望删除速度更快,则需要创建多个传输作业并让它们针对存储桶的不同部分。因为它必须列出存储桶来查找要删除的文件,所以您希望目标路径不重叠(例如 gs://bucket2/folder1/ 和 gs://bucket2/folder2/ 等)。每项工作都将快速并行处理,从而在更短的总时间内完成工作。

通常,与使用对象生命周期管理 (OLM) 相比,我更喜欢这种方式,因为它可以立即启动(无需等待长达 24 小时的策略评估),但有时可能需要 OLM。