【问题标题】:check if google storage bucket is successfully created/is not empty using bash with large bucket size使用大桶大小的 bash 检查谷歌存储桶是否成功创建/不为空
【发布时间】:2019-02-27 13:07:01
【问题描述】:

目前我正在使用:

is_created=$(gsutil du -s ${bucket_name} 2> /dev/null || true)
if [ -z "${is_created}" ]; then
    gsutil mb -p ${GCLOUD_PROJECT} -c regional -l ${gcloud_region} ${bucket_name}
fi

但是,由于我的存储桶很大,并且加载结果需要很长时间。还有其他方法吗?

PS 我试过了:

gsutil -m du -s

并没有看到明显的差异。

【问题讨论】:

    标签: google-cloud-platform google-cloud-storage


    【解决方案1】:

    gsutil du 命令旨在获取有关存储桶对象大小的信息。当然,作为副作用,您可以使用它来确定存储桶是否可访问且不为空(或不为空)。

    请注意,我说的是可访问,而不是已创建,因为您将无法区分未创建、已创建但不可访问(由于权限或某种失败)或可访问但为空的存储桶之间的区别。尝试创建存储桶的最后/空情况除外。

    从性能/持续时间的角度来看,gsutil du 并不是那么好,它在包含大量对象的存储桶中可能会很慢,因为它会花时间进行大小计算,这与您的目标无关。

    可以尝试使用gsutil ls 命令代替,该命令旨在仅获取存储桶中的对象列表,它通常使用比gsutil du 更少的CPU(没有大小信息收集/计算)。不带选项使用它可以防止不必要地收集额外的对象信息,只需对象名称就足以进行空检查。

    可能是这样的:

    missing=$(gsutil ls ${bucket_name} |& grep BucketNotFound | wc -l)
    if [ ${missing} == 1 ]; then
        gsutil mb -p ${GCLOUD_PROJECT} -c regional -l ${gcloud_region} ${bucket_name}
    fi
    

    或者,在有很多对象的桶上更快:

    created=$(gsutil ls -p ${GCLOUD_PROJECT} | grep ${bucket_name} | wc -l)
    if [ ${created} == 0 ]; then
        gsutil mb -p ${GCLOUD_PROJECT} -c regional -l ${gcloud_region} ${bucket_name}
    fi
    

    【讨论】:

    • gsutil ls 向我显示了 bucket_name/subdir(s) 但我无法判断该子目录是否为空。我错了吗?
    • There are no subdirectories in GCS,仅限文件。因此,如果列表中出现了一个目录,那么它就不是空的——它的“存在”是由它决定的。
    • 必须重新打开这个案例。在我的情况下:`gsutil du -s ${bucket_name}` 将显示 XXXX bucket_name/subdir gsutil ls ${bucket_name} 显示 bucket_name/subdir iff 有什么在 bucket_name 下。但是,如果 {bucket_name } 是一个空目录,du 和 ls 的行为会有所不同。
    • 但是这种差异对存储桶本身是否为空没有影响。
    • 有,由于ls/du的输出不同,导致if [ -z "${is_created}" ]校验不一致。
    猜你喜欢
    • 2018-02-24
    • 2016-01-31
    • 2020-04-03
    • 1970-01-01
    • 2018-10-05
    • 2019-10-22
    • 2021-11-27
    • 1970-01-01
    • 2020-07-02
    相关资源
    最近更新 更多