Jak używać interfejsu wiersza polecenia AWS S3 do zrzucania plików na standardowe wyjście w BASH?


93

Rozpoczynam skrypt bash, który weźmie ścieżkę w S3 (zgodnie z poleceniem ls ) i zrzuci zawartość wszystkich obiektów plików stdout. Zasadniczo chciałbym replikować cat /path/to/files/*z wyjątkiem S3, np s3cat '/bucket/path/to/files/*'. Moją pierwszą skłonnością do spojrzenia na opcje jest użycie cppolecenia do pliku tymczasowego, a potem catto.

Czy ktoś próbował tego lub podobnego, czy jest już polecenie, którego nie znajduję, które to robi?


Używam PHP i klasy Services_Amazon_S3, aby robić podobne rzeczy.
Niezrozumiany

Odpowiedzi:


152

zrzuca zawartość wszystkich obiektów plików na standardowe wyjście.

Możesz to osiągnąć, jeśli przejdziesz -jako miejsce docelowe aws s3 cpdowodzenia. Na przykład $ aws s3 cp s3://mybucket/stream.txt -.

To, co próbujesz zrobić, to coś takiego? ::

#!/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
Zauważ jednak, że „-” jako symbol zastępczy dla standardowego wyjścia nie działa we wszystkich wersjach awscli. Na przykład wersja 1.2.9, która jest dostarczana z systemem Ubuntu LTS 14.04.2, nie obsługuje go.
antoniob

To samo. Jestem na Ubuntu 12.xi nie działa w moim przypadku basha.
Kode Charlie

Problem polega na tym, że nie można pobrać określonej wersji pliku.
Eamorr

nie działa na MacOS High Sierra 10.13.6 albo ( aws --version: aws-cli/1.15.40 Python/3.6.5 Darwin/17.7.0 botocore/1.10.40)
MichaelChirico

ta odpowiedź ma również tę zaletę, że zawartość pliku będzie przesyłana strumieniowo do terminala, a nie kopiowana w całości. zobacz więcej na loige.co/aws-command-line-s3-content-from-stdin-or-to-stdout/…
Khoa

47

Jeśli używasz wersji AWS CLI, która nie obsługuje kopiowania do "-", możesz także użyć / dev / stdout:

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

Możesz również chcieć, aby --quietflaga zapobiegała dołączaniu linii podsumowania, takiej jak poniższa, do wyniku:

download: s3: //mybucket/stream.txt do ../../dev/stdout


1

Możesz spróbować użyć s3streamcat , obsługuje on również formaty bzip, gzip i xz.

Zainstaluj za pomocą

sudo pip install s3streamcat

Stosowanie:

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


-3

Jeśli chcesz to osiągnąć za pomocą BASH, będziesz musiał wywołać zewnętrzną aplikację, taką jak AWS Command-Line Interface (CLI). Nie ma odpowiednika CAT, więc musisz skopiować plik lokalnie, a następnie CAT.

Alternatywnie możesz użyć / napisać aplikację, która bezpośrednio wywołuje pakiet AWS SDK, który jest dostępny dla języków takich jak Python, PHP, Java. Korzystając z zestawu SDK, zawartość pliku można pobrać do pamięci, a następnie wysłać na standardowe wyjście.


Powyższa odpowiedź podaje, że możesz użyć 'cp' z '-' jako drugim argumentem pliku, aby wyprowadzić plik na standardowe wyjście.
Asfand Qazi
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.