#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
в противном случае.