Как правильно использовать `gsutil -q stat` в скриптах? - PullRequest
0 голосов
/ 18 апреля 2019

Я создаю сценарий 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 Ответ

1 голос
/ 18 апреля 2019

Инструкция 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 будет искать информация об объекте с именем some-subdir/ (с трейлингом косая черта) внутри ведра some-bucket, в отличие от работы на объекты, вложенные в gs://some-bucket/some-subdir/. Если только ты не на самом деле есть объект с таким именем, операция не удастся.

Причина, по которой ваша команда не дает сбоя при наличии ${DESTINATION_PATH}/, заключается в том, что если вы создадите папку с помощью Cloud Console в пользовательском интерфейсе, то будет создан объект-заполнитель с его именем. Но позвольте мне прояснить: папок в Google Cloud Storage не существует, они представляют собой лишь визуализацию иерархии базовых объектов.

Таким образом, если вы загрузите объект с именем newFolder/object в корзину, а newFolder не существует, он будет "создан", но ваш gsutil -q stat ${DESTINATION_PATH}/ вернет код выхода 1. Однако если вы создадите папку с помощью пользовательского интерфейса и запустите ту же команду, она вернет exit 0. Поэтому следуйте документации и избегайте ее использования для проверки существования каталога.

Вместо этого, если вы хотите проверить, существует ли подкаталог, просто проверьте, содержит ли он какой-либо объект внутри:

gsutil -q stat ${DESTINATION_PATH}/*

, который вернет 0, если какой-либо объект находится в подкаталоге, и 1 в противном случае.

...