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

问题描述 投票:0回答:1

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

那件事为什么会发生?我怎么能做得更好?

google-cloud-storage gsutil
1个回答
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创建文件夹并运行相同的命令,它将返回退出0。因此,请遵循documentation,并避免使用它来检查目录是否存在。

相反,如果你想检查一个子目录是否存在,只需检查它是否包含任何对象:

gsutil -q stat ${DESTINATION_PATH}/*

如果任何对象在子目录中,则返回0,否则返回1

© www.soinside.com 2019 - 2024. All rights reserved.