Как использовать AWS S3 CLI для дампа файлов на стандартный вывод в BASH?


93

Я запускаю сценарий bash, который берет путь в S3 (как указано в команде ls ) и выгружает содержимое всех файловых объектов в stdout. По сути, я бы хотел повторить, cat /path/to/files/*кроме S3, например s3cat '/bucket/path/to/files/*'. Моя первая склонность при просмотре вариантов - использовать cpкоманду для временного файла, а затем для catэтого.

Кто-нибудь пробовал это или подобное, или уже есть команда, которую я не нахожу, которая это делает?


Я использую PHP и класс Services_Amazon_S3 для подобных вещей.
Неправильно

Ответы:


153

выгрузить содержимое всех файловых объектов в стандартный вывод.

Вы можете сделать это, если вы перейдете -к месту назначения aws s3 cpкоманды. Например, $ aws s3 cp s3://mybucket/stream.txt -.

Вы пытаетесь сделать что-то вроде этого? ::

#!/bin/bash

BUCKET=YOUR-BUCKET-NAME
for key in `aws s3api list-objects --bucket $BUCKET --prefix bucket/path/to/files/ | jq -r '.Contents[].Key'`
do
  echo $key
  aws s3 cp s3://$BUCKET/$key - | md5sum
done

5
Однако обратите внимание, что '-' в качестве заполнителя для stdout не работает во всех версиях awscli. Например, версия 1.2.9, которая поставляется с ubuntu LTS 14.04.2, не поддерживает его.
antoniob

То же самое. Я использую Ubuntu 12.x, и это не работает в моем экземпляре bash.
Kode Charlie

Проблема в том, что вы не можете получить конкретную версию файла.
Eamorr 04

не работает на MacOS High Sierra 10.13.6 либо ( aws --version: aws-cli/1.15.40 Python/3.6.5 Darwin/17.7.0 botocore/1.10.40)
MichaelChirico

Этот ответ также имеет то преимущество, что содержимое файла будет передаваться на ваш терминал, а не копироваться целиком. см. больше на loige.co/aws-command-line-s3-content-from-stdin-or-to-stdout/…
Khoa

47

Если вы используете версию интерфейса командной строки AWS, которая не поддерживает копирование в "-", вы также можете использовать / dev / stdout:

$ aws s3 cp --quiet s3://mybucket/stream.txt /dev/stdout

Вы также можете захотеть, чтобы --quietфлаг предотвращал добавление к вашему выводу итоговой строки, подобной следующей:

скачать: s3: //mybucket/stream.txt в ../../dev/stdout


1

Вы можете попробовать использовать s3streamcat , он также поддерживает форматы bzip, gzip и xz.

Установить с помощью

sudo pip install s3streamcat

Применение:

s3streamcat s3://bucketname/dir/file_path
s3streamcat s3://bucketname/dir/file_path | more
s3streamcat s3://bucketname/dir/file_path | grep something


-3

Если вы хотите добиться этого с помощью BASH, вам придется обращаться к внешнему приложению, например к интерфейсу командной строки AWS (CLI). У него нет эквивалента CAT, поэтому вам нужно будет скопировать файл локально, а затем CAT.

В качестве альтернативы вы можете использовать / написать приложение, которое напрямую вызывает AWS SDK, который доступен для таких языков, как Python, PHP, Java. Используя SDK, содержимое файла можно получить в памяти, а затем отправить в стандартный вывод.


В приведенном выше списке ответов вы можете использовать 'cp' с '-' в качестве второго аргумента файла, чтобы он выводил файл на стандартный вывод.
Асфанд Кази
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.