如何知道 GCP 存储桶中是否存在路径 "gs://bucket1/folder_x"

How to know path "gs://bucket1/folder_x" existing or not in GCP bucket

是否有“'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'”,但不能测试目录。

'''groovy

管道{

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 可以在不可用时跳过错误的路径。

云存储中不存在该目录。这是一个图形表示。所有 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())