使用 gsutil 列出存储桶中所有对象的所有 public 链接
Listing all public links for all objects in a bucket using gsutil
有没有办法列出存储在 Google Cloud Storage 存储桶(或存储桶中的目录)使用 Cloud SDK 的 gsutil
或 gcloud
?
类似于:
$ gsutil ls --public-link gs://my-bucket/a-directory
Public 公开可见对象的链接是可预测的。他们只是匹配这个模式:https://storage.googleapis.com/BUCKET_NAME/OBJECT_NAME
.
gsutil 没有打印存储桶中对象 URL 的命令,但它只能列出对象。您可以将其通过管道传递给 sed 之类的程序,以用对象名称替换这些列表。例如:
gsutil ls gs://pub/** | sed 's|gs://|https://storage.googleapis.com/|'
缺点是这会产生指向所有资源的链接,而不仅仅是那些公开可见的资源。因此,您需要知道哪些资源是公开可见的,或者您需要根据 gsutil ls -L
.
编写更精细的过滤器
尽管问题是关于可能的标志传递给 gsutil
以获得预期结果,但由于目前没有,我想 post 另一种编程方法使用可以扩展 and/or 以适应 Python 模块的 Cloud Storage Client Library。
如下(唯一的第三方依赖是google-cloud-storage):
python3 -c """
from operator import attrgetter
from pathlib import Path
import sys
from google.cloud import storage
url = Path(sys.argv[1]) #a blob with the objects we want...
bucket = storage.Client().bucket(url.parent.name)
urls = tuple(map(attrgetter('public_url'), filter(lambda blob:not blob.name.endswith('/'), bucket.list_blobs(prefix=url.name)))) # TODO improve this as not only excludes self blob as homologous 'folder' abstraction blobs inside
print('\n'.join(urls))
""" gs://my-bucket/a-directory
有没有办法列出存储在 Google Cloud Storage 存储桶(或存储桶中的目录)使用 Cloud SDK 的 gsutil
或 gcloud
?
类似于:
$ gsutil ls --public-link gs://my-bucket/a-directory
Public 公开可见对象的链接是可预测的。他们只是匹配这个模式:https://storage.googleapis.com/BUCKET_NAME/OBJECT_NAME
.
gsutil 没有打印存储桶中对象 URL 的命令,但它只能列出对象。您可以将其通过管道传递给 sed 之类的程序,以用对象名称替换这些列表。例如:
gsutil ls gs://pub/** | sed 's|gs://|https://storage.googleapis.com/|'
缺点是这会产生指向所有资源的链接,而不仅仅是那些公开可见的资源。因此,您需要知道哪些资源是公开可见的,或者您需要根据 gsutil ls -L
.
尽管问题是关于可能的标志传递给 gsutil
以获得预期结果,但由于目前没有,我想 post 另一种编程方法使用可以扩展 and/or 以适应 Python 模块的 Cloud Storage Client Library。
如下(唯一的第三方依赖是google-cloud-storage):
python3 -c """
from operator import attrgetter
from pathlib import Path
import sys
from google.cloud import storage
url = Path(sys.argv[1]) #a blob with the objects we want...
bucket = storage.Client().bucket(url.parent.name)
urls = tuple(map(attrgetter('public_url'), filter(lambda blob:not blob.name.endswith('/'), bucket.list_blobs(prefix=url.name)))) # TODO improve this as not only excludes self blob as homologous 'folder' abstraction blobs inside
print('\n'.join(urls))
""" gs://my-bucket/a-directory