如何在脚本中正确使用 `gsutil -q stat`?
How to correctly use `gsutil -q stat` in scripts?
我正在创建一个 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 command可用于检查对象是否存在:
gsutil -q stat gs://some-bucket/some-object
现有对象的退出状态为 0
,不存在的对象的退出状态为 1
。
但是建议不要将它与子目录一起使用:
Note: Unlike the gsutil ls
command, the stat
command does not support
operations on sub-directories. For example, if you run the command:
gsutil -q stat gs://some-bucket/some-subdir/
gsutil will look for
information about an object called some-subdir/
(with a trailing
slash) inside the bucket some-bucket
, as opposed to operating on
objects nested under gs://some-bucket/some-subdir/
. Unless you
actually have an object with that name, the operation will fail.
当您的 ${DESTINATION_PATH}/
存在时您的命令没有失败的原因是因为如果您 create the folder using the Cloud Console i.e the UI, then a placeholder object will be created with its name. But let me be clear, folders don't exist in Google Cloud Storage,它们只是存储桶对象层次结构的可视化。
因此,如果您将名为 newFolder/object
的对象上传到您的存储桶并且 newFolder
不存在,它将是 "created" 但您的 gsutil -q stat ${DESTINATION_PATH}/
将 return 退出代码 1
。但是,如果您使用 UI 和 运行 相同的命令创建文件夹,它将 return 退出 0
。因此遵循 documentation,并避免使用它来检查目录是否存在。
相反,如果你想检查一个子目录是否存在,只需检查它是否包含任何对象:
gsutil -q stat ${DESTINATION_PATH}/*
如果子目录中有任何对象,则 return 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}/
存在,脚本将按预期正常 运行。
为什么会这样?我怎样才能做得更好?
声明 set -e
意味着如果命令以 non-zero status
退出,您的脚本将退出。
gsutil stat command可用于检查对象是否存在:
gsutil -q stat gs://some-bucket/some-object
现有对象的退出状态为 0
,不存在的对象的退出状态为 1
。
但是建议不要将它与子目录一起使用:
Note: Unlike the
gsutil ls
command, thestat
command does not support operations on sub-directories. For example, if you run the command:
gsutil -q stat gs://some-bucket/some-subdir/
gsutil will look for information about an object called
some-subdir/
(with a trailing slash) inside the bucketsome-bucket
, as opposed to operating on objects nested undergs://some-bucket/some-subdir/
. Unless you actually have an object with that name, the operation will fail.
当您的 ${DESTINATION_PATH}/
存在时您的命令没有失败的原因是因为如果您 create the folder using the Cloud Console i.e the UI, then a placeholder object will be created with its name. But let me be clear, folders don't exist in Google Cloud Storage,它们只是存储桶对象层次结构的可视化。
因此,如果您将名为 newFolder/object
的对象上传到您的存储桶并且 newFolder
不存在,它将是 "created" 但您的 gsutil -q stat ${DESTINATION_PATH}/
将 return 退出代码 1
。但是,如果您使用 UI 和 运行 相同的命令创建文件夹,它将 return 退出 0
。因此遵循 documentation,并避免使用它来检查目录是否存在。
相反,如果你想检查一个子目录是否存在,只需检查它是否包含任何对象:
gsutil -q stat ${DESTINATION_PATH}/*
如果子目录中有任何对象,则 return 0
否则 1
。