#python #google-cloud-storage #gsutil #google-cloud-sdk
#python #google-облачное хранилище #gsutil #google-cloud-sdk
Вопрос:
Я хочу:
- Доступ ко всем проектам GCP, связанным с моей учетной записью Google.
- Получите все сегменты
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, Content-Type, 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)
Ответ №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)
Можно получить другие метаданные.