问题:可以在带有gsutil的GCS桶名中使用通配符吗?
我想使用分配在存储桶中的通配符来抓取GCS中的多个文件。但是,在使用gsutil的存储桶名称中使用通配符时,我一直遇到错误。我正在使用这样的通配符:
gsutil ls gs://myBucket-abcd-*/log/data_*
我希望匹配所有这些文件名(存储桶名称和对象名称中的变体):
gs://myBucket-abcd-1234/log/data_foo.csv
gs://myBucket-abcd-1234/log/data_bar.csv
gs://myBucket-abcd-5678/log/data_foo.csv
gs://myBucket-abcd-5678/log/data_bar.csv
Documentation on Bucket Wildcards告诉我,我应该能够在bucketname和object name中使用通配符,但上面的代码示例总是会出现“BadRequestException:400 Invalid argument。”
当我不使用通配符或仅在对象名称中使用通配符时,gsutil正在工作。但是为存储桶名称添加通配符会导致错误。有没有办法使通配符在存储桶名称中工作,还是我误解了链接的文档?
答案 0 :(得分:2)
发现在这种情况下无法使用存储桶通配符正在按预期工作,并且是由于权限设置的差异。可以在存储桶和项目级别设置Google云端存储权限。
虽然在这种情况下使用的访问令牌可以访问每个桶,但它没有读者/编辑者/所有者访问顶级项目(在系统的许多用户之间共享)。如果没有访问项目,就不能在通配符上使用通配符。
这可以通过让项目所有者将用户添加为项目的读者/编辑者/所有者来解决。
在这种情况下,出于安全原因,我们无法为项目中的所有存储桶提供单独的令牌访问权限,但它有助于理解通配符无法正常工作的原因。感谢所有人的投入,尤其是特拉维斯的联系。
答案 1 :(得分:1)
某些 shell (Zsh) 试图扩展 * 和 ** ,因此您需要将这些包含在引号内。像这样
gsutil ls 'gs://myBucket-abcd-*/log/data_*'