如何在脚本中正确使用`gsutil -q stat`?

时间:2019-04-18 10:14:04

标签: google-cloud-storage gsutil

我正在创建一个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}/,该脚本将按预期正常运行。

为什么会发生这种事情?我该怎么做?

1 个答案:

答案 0 :(得分:0)

语句set -e表示如果命令以non-zero status退出,则脚本将退出。

gsutil stat command可用于检查对象是否存在:

gsutil -q stat gs://some-bucket/some-object

对于现有对象,其退出状态为0,对于不存在对象,其退出状态为1

但是建议不要将其与子目录一起使用:

  

注意:与gsutil ls命令不同,stat命令不支持   子目录上的操作。例如,如果您运行命令:

     

gsutil -q stat gs://some-bucket/some-subdir/

     

gsutil将寻找   有关名为some-subdir/的对象的信息(带有尾随   斜线),而不是在some-bucket   嵌套在gs://some-bucket/some-subdir/下的对象。除非你   实际上有一个具有该名称的对象,该操作将失败。

${DESTINATION_PATH}/存在时,命令不会失败的原因是,如果您create the folder using the Cloud Console(即UI),则会创建一个占位符对象并使用其名称。但是让我清楚一点,folders don't exist in Google Cloud Storage,它们只是存储桶对象层次结构的可视化。

因此,如果将名为newFolder/object的对象上载到存储桶中,而newFolder不存在,则会“创建”该对象,但是您的gsutil -q stat ${DESTINATION_PATH}/将返回退出代码{{1} }。但是,如果使用UI创建文件夹并运行相同的命令,它将返回出口1。因此,请遵循documentation,并避免使用它来检查目录是否存在。

相反,如果要检查子目录是否存在,只需检查子目录中是否包含任何对象即可:

0

如果子目录中有任何对象,则返回gsutil -q stat ${DESTINATION_PATH}/*,否则返回0