我正在创建一个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}/
,该脚本将按预期正常运行。
为什么会发生这种事情?我该怎么做?
答案 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
。