【问题标题】:How to know path "gs://bucket1/folder_x" existing or not in GCP bucket如何知道 GCP 存储桶中是否存在路径“gs://bucket1/folder_x”
【发布时间】:2021-05-30 06:28:37
【问题描述】:

是否有 '''gsutil''' 命令可以告诉我路径 '''gs://bucket1/folder1_x/folder2_y/''' 是否存在? gsutil 中是否有“ping”命令? 我使用 Jenkins 参数 folder_x 和 folder_y 值由用户输入,并通过管道加入。目前,如果目录确实存在,则管道将显示成功。但是如果路径错误,流水线就会中断,显示失败。

尝试使用gsutil stat和gsutil -q stat,它可以测试'''gs://bucket1/folder1_x/folder2_y/file1''',但不能用于dir。

'''时髦的

管道{

stages {

    stage('Check existing dirs') {

        steps {
            script{

                if (params['Action'] =="List_etl-output") {

                    def Output_Data="${params['Datasource']}".toString().split(",").collect{"\"" + it + "\""}
                    def Output_Stage="${params['Etl_Output_Stage']}".toString().split(",").collect{"\"" + it + "\""}
                    for (folder1 in Output_Data) {
                        for (folder2 in Output_Stage) {
                        sh(script:  """

                           gsutil ls -r gs://bucket1/*/$Data/$Stage
                          
                      """ )

                    }
                }
            }
        }
      }
    }

} }

'''

我使用 gsutil 检查路径 gs://bucket1/*/$Data/$Stage 是否可用。 $Data 和 $Stage 由用户输入给出,当路径不可用时 Jenkins 管道中断。我希望 gsutil 在不可用时可以跳过错误的路径。

【问题讨论】:

  • 请注意,谷歌存储中没有通常意义上的文件夹,它会产生层次结构的错觉,而实际上它使用的是平面名称空间。
  • 这里有更多内容:link。你可以做的是你可以尝试列出它,如果你得到一个例外 - 没有“文件夹”,否则如果列表只是“文件夹”本身 - 它是“空的”,否则如果列表有> = 2个条目- 它不是“空的”。

标签: google-cloud-platform bucket gsutil


【解决方案1】:

该目录在 Cloud Storage 中不存在。这是一个图形表示。所有 blob 都存储在存储桶根目录中,它们的名称由完整路径组成(您将 / 解释为目录,但不是)。也是因为这个,你只能搜索前缀。

要回答您的问题,您可以使用这个最新功能:搜索前缀。如果有 1 个元素,则该文件夹存在,因为至少有 1 个带有此前缀的 blob。这里是 Python 的一个例子(我不懂你的语言,如果你需要,我可以把它改编成多种语言)

    from google.cloud import storage
    client = storage.Client()
    bucket = client.get_bucket('bucket1')
    if len(list(bucket.list_blobs(prefix='folder_x/'))):
      print('there is a file in the "directory"')
    else:
      print('No file with this path, so no "directory"')


这里是 Groovy 中的示例

import com.google.cloud.storage.Bucket
import com.google.cloud.storage.Storage
import com.google.cloud.storage.StorageOptions

Storage storage = StorageOptions.getDefaultInstance().service
Bucket bucket = storage.get("bucket1")

System.out.println(bucket.list(Storage.BlobListOption.prefix("folder_x/")).iterateAll().size())

【讨论】:

  • 这里真的需要len()吗?
  • 会不会是if any(bucket.list_blobs(prefix='folder_x/')):
  • 提醒一下,有一些商业工具可以创建 0 长度对象来表示目录。对象元数据用于记录时间戳、权限、对象类型等。
  • @JohnHanley,不是特别的商业工具。甚至 GCS 云控制台也允许使用空内容和空名称“创建目录”。这给 GCS 的真实行为带来了越来越多的困惑,用户越来越不了解 GCS 平台当前的优缺点,使用不正确,在这里提问!!
  • 谢谢@guillaume blaquiere。你是天才。
猜你喜欢
  • 2021-08-12
  • 2022-11-12
  • 2015-10-10
  • 2011-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-23
相关资源
最近更新 更多