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