如何使用gsutil删除gcs中的多个文件,除了1

Posted

技术标签:

【中文标题】如何使用gsutil删除gcs中的多个文件,除了1【英文标题】:How to delete multiple files in gcs except 1 using gsutil 【发布时间】:2021-02-04 18:06:09 【问题描述】:

我目前有这个:gsutil ls gs://basty/*_TZ001.*

gs://basty/20201007_TZ001.csv
gs://basty/20201008_TZ001.csv
gs://basty/20201009_TZ001.csv

我的问题是我的 bcuket 有很多文件,我想删除除 1 之外的所有文件 (20201009_TZ001.csv)

我认为使用 bash 或 python 我不知道。

【问题讨论】:

【参考方案1】:

您可以使用 grep 过滤结果(使用 -v 标志来反转结果)和使用 xargs

的管道
gsutil ls gs://basty/*_TZ001.* |\
  grep -v 20201009_TZ001.csv |\
  xargs -i gsutil rm 

为了确保这正是您想要的,您可以先执行一个空运行命令:

gsutil ls gs://basty/*_TZ001.* |\
  grep -v 20201009_TZ001.csv |\
  xargs -i echo "Will delete: " 

【讨论】:

我在 MacOS 上测试时收到illegal option -- i。如果 xargs 标志更改为 -I【参考方案2】:

我有另一个解决方案。这个基于temporary holds。我建议您在存储桶内创建一个新文件夹。然后,在其中添加一个临时保留,如下所示:

gsutil -m  retention temp set gs://BUCKETNAME/FOLDER/

然后,将您不想删除的所有文件添加到此文件夹

执行命令:

gsutil rm gs://BUCKET/*

您将看到如何跳过FOLDER删除所有文件。

最后,解除持有:

gsutil -m  retention temp release  gs://BUCKETNAME/FOLDER/

【讨论】:

【参考方案3】:

还有一个解决方案

gsutil ls -r gs://basty/*_TZ001.* | grep -v 20201009_TZ001.csv | gsutil -m rm -I
它的工作速度非常快,因为它同时删除文件,而不是一一删除(命令中的 -m 选项) 它不使用让整个操作变慢的保持 如果将gs://basty/*_TZ001.* 替换为gs://basty/**,它适用于存储桶文件结构中任何级别的文件

【讨论】:

以上是关于如何使用gsutil删除gcs中的多个文件,除了1的主要内容,如果未能解决你的问题,请参考以下文章

Gsutil - 如何使用 Gsutil 检查 GCS 存储桶(子目录)中是不是存在文件

从 GCS 中删除文件:“gsutil -m rm”引发 CommandException:无法删除文件/对象

快速删除 GCS 存储桶上的大文件夹的方法

使用 gsutil 将数据从 aws s3 传输到 gcs - SSL 认证错误

如何限制从 bigquery 导出到 gcs 的文件大小?

如果不存在文件,则处理 gsutil ls 和 rm 命令错误