google-cloud-storage - 如何在脚本中正确使用`gsutil -q stat`?
问题描述
我正在创建一个 KSH 脚本来检查 GCS 存储桶上是否存在子目录。我正在编写这样的脚本:
#!/bin/ksh
set -e
set -o pipefail
gsutil -q stat ${DESTINATION_PATH}/
PATH_EXIST=$?
if [ ${PATH_EXIST} -eq 0 ] ; then
# do something
fi
${DESTINATION_PATH}/
当不存在时会发生奇怪的事情,脚本退出而不评估PATH_EXIST=$?
。如果${DESTINATION_PATH}/
存在,脚本将按预期正常运行。
为什么会发生这种事?我怎样才能做得更好?
解决方案
该语句set -e
意味着如果命令以non-zero status
.
gsutil stat 命令可用于检查对象是否存在:
gsutil -q stat gs://some-bucket/some-object
0
对于现有对象和不存在对象,它具有退出状态1
。
但是,建议不要将其与子目录一起使用:
注意:与
gsutil ls
命令不同的是,该stat
命令不支持对子目录的操作。例如,如果您运行以下命令:
gsutil -q stat gs://some-bucket/some-subdir/
gsutil 将在 bucket 中查找有关名为
some-subdir/
(带有尾部斜杠)的对象的信息some-bucket
,而不是对嵌套在 下的对象进行操作gs://some-bucket/some-subdir/
。除非您实际上有一个具有该名称的对象,否则操作将失败。
存在时您的命令没有失败的原因${DESTINATION_PATH}/
是,如果您使用 Cloud Console即 UI 创建文件夹,则将使用其名称创建一个占位符对象。但让我明确一点,Google Cloud Storage 中不存在文件夹,它们只是存储桶对象层次结构的可视化。
因此,如果您将一个名为的对象上传newFolder/object
到您的存储桶并且该对象newFolder
不存在,它将被“创建”,但您gsutil -q stat ${DESTINATION_PATH}/
将返回退出代码1
。但是,如果您使用 UI 创建文件夹并运行相同的命令,它将返回 exit 0
。因此请遵循文档,并避免使用它来检查目录是否存在。
相反,如果您想检查子目录是否存在,只需检查它是否包含任何对象:
gsutil -q stat ${DESTINATION_PATH}/*
0
如果任何对象在子目录中,则将返回,1
否则返回。
推荐阅读
- reactjs - 在客户端显示抓取的数据
- mysql - 没有作曲家的 PhpSpreadsheet。“使用”在 php 文件中不起作用
- r - 如何在ggplot2中获得堆叠geom_bar和geom_point的共同图例?
- angular - Jasmine - 无法访问自定义 Web 组件的 shadowRoot
- django - Django 中 DateField 的 RuntimeWarning
- apache-flink - 全局处理数据管道的异常
- python - 为什么我会在 Linux 系统上收到针对 winreg 的 ModuleNotFoundError?
- python - Numpy/Scipy 如何将 C 函数转换为向量化 Python 函数?
- mapping - Tableau 映射,BEA 代码?
- ruby-on-rails - 测试在 RSpec 中有重定向的请求