问题描述
我要:
- 访问所有链接到我的Google帐户的GCP项目。
- 获取名称中包含单词
foobar
的所有存储桶。 - 从Google(
Creation time,Update time,Storage class,Content-Length,Content-Type,Hash (crc32c),Hash,ETag,Generation,Metageneration,ACL,TOTAL
)提供的元数据中检索某些元数据,例如Creation time
和Content-Type
和TOTAL
。 - 将结果保存为.csv / dataframe格式,其中包含以下字段:
foobar,Creation time,TOTAL
我不想:
- 虽然我认为只有文件才有元数据,但如果子目录也有元数据,我不想获取子目录的元数据。
- 通过文件夹解析来覆盖它。一些存储桶具有大量的子目录。我想以最便宜的方式找到感兴趣的物体。
到目前为止我所拥有的:
- 我使用
gcloud projects list
将所有项目链接到我的帐户。 - 我使用以下字段手动创建了一个.csv文件:
project_id,recursive,selected
。recursive
TRUE
适用于那些我知道它们没有那么多文件夹的人,因此我有能力浏览所有子目录。selected
TRUE
只是帮助我完成了一些项目,而不是全部。 - 对于所有
selected
字段为TRUE
的项目,我都使用以下命令收集数据并将其保存在文件中:gsutil ls -L -p "${project}" gs://*foobar* >> non_recursive.csv
- 对于
selected
和recursive
字段为TRUE
的所有项目,我收集数据并将其保存到文件中,并使用以下命令:gsutil ls -r -L -p "${project}" gs://*secret* >> recursive.csv
所以我的问题:
- 如何修改此内容:
gsutil ls -L -p "${project}" gs://*foobar* >> non_recursive.csv
仅收集一些元数据字段并以上述数据帧格式输出? - 是否有更好的方法来执行上述操作? (请仅使用Python或Bash解决方案)
解决方法
您可以生成要为其获取元数据的文件的列表,然后为每个文件生成一个gsutil ls
命令,例如,
sed 's/\(.*\)/gsutil ls -L \1/' objects_to_list | sh
如果有大量此类对象,则可以并行列出列表,例如
sed 's/\(.*\)/gsutil ls -L \1/' objects_to_list | split -l 100 - LISTING_PART
for f in LISTING_PART*; do
sh $f > $f.out &
done
wait