【问题标题】:How to check if any given object exist in google cloud storage bucket through bash如何通过bash检查谷歌云存储桶中是否存在任何给定对象
【发布时间】:2018-07-18 12:07:19
【问题描述】:

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

我已经通过https://cloud.google.com/storage/docs/gsutil/commands/stat 和文档提到“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

【问题讨论】:

    标签: google-cloud-storage gsutil


    【解决方案1】:

    我看到您已经找到了您的问题的答案,但是,我将在此处发布此答案,以便提供更多关于 gsutil stat 命令如何工作以及您的代码为什么不起作用的上下文。

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

    使用gsutil stat gs://&lt;BUCKET_NAME&gt;/&lt;BUCKET_OBJECT&gt; 命令,返回如下内容:

    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
    

    【讨论】:

    • 另外一点:GCS 没有“目录”的概念,尽管 gsutil 尝试通过使用对象名称前缀来创建这种错觉。 gsutil stat 仅对完整的对象名称起作用,而不是“目录”/前缀。在评估每个参数时,gsutil 实际上会删除尾部斜杠(如果存在)。因此,针对“gs://bucket/dir”和“gs://bucket/dir/”运行gsutil stat 都会检查“gs://bucket/dir”是否存在。此外,如果该确切对象不存在,gsutil stat gs://bucket/dir 将返回失败代码,即使具有该前缀的某些内容(例如 gs://bucket/dir/obj)存在。
    【解决方案2】:

    你有条件检查倒置:退出状态 0 表示成功,即 gsutil stat 命令找到了给定的对象。

    【讨论】:

    • @mike.schwartz - 感谢您的回复,但我认为这不是问题,因为我已经通过反转条件检查对此进行了测试。例如:我设置 $return_value = 0 并检查退出对象是否存在。物理上,对象存在于 gcs 存储桶中,并且我的脚本在反转条件后,抛出正确的输出说对象存在,但是如果我寻找一些实际上甚至不存在于 gcs 存储桶中的其他对象,它仍然说对象存在。所以看起来 gsutil -q stat 命令在返回状态值时存在一些问题。
    • gsutil -q stat 对我有用:% gsutil mb gs://test-bucket-abc123 创建 gs://test-bucket-abc123/... % echo "hi" | gsutil cp - gs://test-bucket-abc123/hi 从 复制.../[1 个文件][0.0 B/0.0 B] 操作已完成超过 1 个对象。 % gsutil -q stat gs://test-bucket-abc123/hi % return_value=$? % echo $return_value 0 % gsutil -q stat gs://test-bucket-abc123/non-existent % return_value=$? % 回声 $return_value 1
    【解决方案3】:

    问题是我们应该在对象之后使用 / 以确保 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
    

    【讨论】:

      猜你喜欢
      • 2023-03-26
      • 1970-01-01
      • 2020-02-27
      • 1970-01-01
      • 2021-06-01
      • 1970-01-01
      • 2018-05-11
      • 2021-04-07
      • 1970-01-01
      相关资源
      最近更新 更多