如果文件不存在,则无一例外地从 GCS 中删除

Delete from GCS without exception if file is not present

我正在通过 python 调用 shell 脚本。

在脚本中,我正在使用 gsutil rmgsutil cp 命令。

但是只要这 2 个命令中的任何一个 运行 在不存在的 gcp 路径上,它就会出错。

例如:当我尝试时:

gsutil rm -r gs://some-bucket/somepath-not-present/

我收到一个错误:

CommandException: 1 files/objects could not be removed.

最后脚本的 return 代码是 1。即使我的代码执行得很好。我希望脚本在找不到路径时不会出错。

有没有办法绕过这个。我试过 linux 中的 ||,但它似乎不起作用。

如果您在另一个可能受 gsutil 打印的异常影响的脚本中使用 gsutil,您可以简单地尝试将 stderr 重定向到 /dev/null,如下所示:

gsutil rm -r gs://some-bucket/somepath-not-present/ 2> /dev/null

但是,请注意此时您将开始忽略命令生成的任何错误。如果你 echo $?,你仍然会得到 1 的错误代码,它可以告诉你文件不存在或发生了其他异常。

编辑:

如果您想使用退出代码 0 退出脚本,您可以这样做

gsutil rm -r gs://some-bucket/somepath-not-present/ || exit 0

或者如果您只想将命令设为 return 0,您可以使用

gsutil rm -r gs://some-bucket/somepath-not-present/ || true

令我惊讶的是 Google 还没有解决这个问题。我遇到了同样的问题,我依赖构建脚本继续 运行,即使存储桶已经是空的。

我想出了以下解决方法:

if [[ $(gsutil du gs://my-bucket | wc -l) -gt 0 ]]; then gsutil -m rm -rf gs://my-bucket/*; fi

它基本上计算桶中对象的数量,并且仅在计数大于零时才运行gsutil rm