如何通过bash检查谷歌云存储桶中是否存在任何给定对象

时间:2018-02-08 02:48:41

标签: google-cloud-storage gsutil

我想务实地检查对象谷歌云存储桶中是否存在对象。基于对象可用性,我将执行进一步的操作。

我已经完成https://cloud.google.com/storage/docs/gsutil/commands/stat并且doc提到" gsutil -q "对于编写脚本很有用,因为现有对象的退出状态为0,不存在的对象的退出状态为1。但是当我使用命令时,它无法正常工作。如果有人试过这个,请告诉我吗?

#!/bin/bash
gsutil -q stat gs://<bucketname>/object

return_value=$?

if [ $return_value != 0 ]; then
    echo "folder exist"
else
    echo "folder does not exist"
fi

3 个答案:

答案 0 :(得分:2)

您已反转条件检查:退出状态0表示成功,即gsutil stat命令找到给定对象。

答案 1 :(得分:1)

我发现您已经找到了问题的答案,但是,我将在此处发布此答案,以便提供有关gsutil stat命令如何工作以及您的代码无法正常工作的更多背景信息。

gsutil是一个Python应用程序,用于使用命令行界面访问和使用云存储。它有许多可用的命令,您使用的命令是gsutil stat,它输出检索最小可能数据的对象的元数据,而不必列出存储桶中的所有对象。此命令也是strongly consistent,这使其成为某些类型应用程序的合适解决方案。

使用gsutil stat gs://<BUCKET_NAME>/<BUCKET_OBJECT>命令返回如下内容:

gs://<BUCKET_NAME>/<BUCKET_OBJECT>.png:
    Creation time:          Tue, 06 Feb 2018 14:49:58 GMT
    Update time:            Tue, 06 Feb 2018 14:49:58 GMT
    Storage class:          MULTI_REGIONAL
    Content-Length:         6119
    Content-Type:           image/png
    Hash (crc32c):          <CRC32C_HASH>
    Hash (md5):             <MD5_HASH>
    ETag:                   <ETAG>
    Generation:             <TIMESTAMP>
    Metageneration:         1

但是,如果使用-q运行它,如果对象存在则返回0,如果不存在则返回1,这使编写脚本(如你分享的一个。

最后,在使用存储桶中的子目录时,您还需要考虑一些其他注意事项:

  • gsutil -q stat gs://my_bucket/my_subdirectory之类的命令将检索名为my_subdirectory的对象的数据,而不是目录本身的数据。
  • 诸如gsutil -q stat gs://my_bucket/my_subdirectory/之类的命令将在子目录本身上运行,而不是在嵌套文件上运行,因此它只会告诉您子目录是否存在(这就是您的代码失败的原因< /强>)。
  • 您必须使用gsutil -q stat gs://my_bucket/my_subdirectory/my_nested_file.txt之类的内容来检索嵌套在子目录下的文件的元数据。

因此,简而言之,您的问题是您没有对路径做出正确的定义。并不是gsutil在理解路径时过于敏感,但这种行为是按预期工作的,因为您可能遇到以下情况:您有一个文件和一个同名文件夹,并且您应该能够检索它们中的任何一个,因此需要指定/来指示它是目录还是文件:

gs://my_bucket/
  |_ my_subdirectory        #This is a file
  |_ my_subdirectory/       #This is a folder
     |_ my_nested_file.txt  #This is a nested file

答案 2 :(得分:0)

问题是我们应该使用/ after对象来确保gsutil -q stat命令正确识别路径。如果我删除/然后它不起作用。如果谷歌对理解路径如此敏感,我会感到惊讶。

#!/bin/bash
gsutil -q stat gs://<bucketname>/object/

return_value=$?

if [ $return_value = 0 ]; then
    echo "folder exist"
else
    echo "folder does not exist"
fi