Как правильно использовать `gsutil -q stat` в скриптах?

#google-cloud-storage #gsutil

# #google-облачное хранилище #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:

Инструкция set -e подразумевает, что ваш скрипт будет завершен, если команда завершит работу с помощью a 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}/ она существует, заключается в том, что если вы создаете папку с помощью облачной консоли, то есть пользовательского интерфейса, то будет создан объект-заполнитель с его именем. Но позвольте мне внести ясность: папок в облачном хранилище Google не существует, они представляют собой всего лишь визуализацию иерархии объектов корзины.

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

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

gsutil -q stat ${DESTINATION_PATH}/*

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