Как получить информацию о метаданных конкретного объекта из облачного хранилища Google?

#python #google-cloud-storage #gsutil #google-cloud-sdk

#python #google-облачное хранилище #gsutil #google-cloud-sdk

Вопрос:

Я хочу:

  1. Доступ ко всем проектам GCP, связанным с моей учетной записью Google.
  2. Получите все сегменты foobar , в названии которых содержится слово.
  3. Извлеките некоторые метаданные из тех, которые предоставлены Google ( Creation time, Update time, Storage class, Content-Length, Content-Type, Hash (crc32c), Hash, ETag, Generation, Metageneration, ACL, TOTAL ), например Creation time , и Content-Type и TOTAL .
  4. Сохраните результаты в формате .csv / dataframe с полями типа: foobar, Creation time, Content-Type, TOTAL

Я не хочу:

  1. Хотя я думаю, что метаданные есть только у файлов, в случае, если у подкаталогов тоже есть метаданные, я не хочу захватывать метаданные подкаталогов.
  2. Переусердствуйте с разбором папок. В некоторых сегментах есть множество подкаталогов. Мне нужен самый дешевый способ добраться до интересующих объектов.

Что у меня есть до сих пор:

  1. Я использую gcloud projects list , чтобы связать все проекты с моей учетной записью.
  2. Я вручную создаю файл .csv с полями: project_id, recursive, selected . recursive TRUE для тех, кого я знаю, у них не так много папок, поэтому я могу позволить себе просматривать все подкаталоги. selected TRUE просто помогает мне просмотреть некоторые проекты, а не все.
  3. Для всех проектов, в которых selected есть поле TRUE , я собираю данные и сохраняю их в файле с помощью следующей команды: gsutil ls -L -p "${project}" gs://*foobar* >> non_recursive.csv
  4. Для всех проектов, в которых selected recursive есть поля и TRUE , я собираю данные и сохраняю их в файле с помощью следующей команды: gsutil ls -r -L -p "${project}" gs://*secret* >> recursive.csv

Итак, мои вопросы:

  1. Как я могу это изменить: gsutil ls -L -p "${project}" gs://*foobar* >> non_recursive.csv собирать только некоторые поля метаданных и выводить их в формате фрейма данных, упомянутом выше?
  2. Есть ли лучший способ сделать это выше? (Пожалуйста, только решения на Python или Bash)

Ответ №1:

Вы можете сгенерировать список файлов, для которых вы хотите получить метаданные, а затем сгенерировать 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 amp;
done
wait
  

Комментарии:

1. Ваш ответ охватывает 1-й вопрос?

Ответ №2:

Это возвращает filename и mimeType:

 blobs = storage_client.list_blobs(BUCKET)
for blob in blobs:
    item = {'content': "gs://{}/{}".format(blob.bucket.name,blob.name), 'mimeType': "{}".format(blob.content_type)}
    print(item)
  

Можно получить другие метаданные.