¿Cómo utilizar la CLI de AWS S3 para volcar archivos a la salida estándar en BASH?

93

Estoy iniciando un script bash que tomará una ruta en S3 (como se especifica en el comando ls ) y volcará el contenido de todos los objetos de archivo en stdout. Básicamente, me gustaría replicar, cat /path/to/files/*excepto para S3, por ejemplo s3cat '/bucket/path/to/files/*'. Mi primera inclinación al mirar las opciones es usar el cpcomando en un archivo temporal y luego cateso.

¿Alguien ha probado esto o algo similar o ya hay un comando que no encuentro que lo hace?

Neil C. Obremski
fuente
Utilizo PHP y la clase Services_Amazon_S3 para hacer cosas similares.
Mal entendido

Respuestas:

152

volcar el contenido de todos los objetos de archivo a stdout.

Puede lograr esto si pasa -por destino de aws s3 cpcomando. Por ejemplo $ aws s3 cp s3://mybucket/stream.txt -,.

¿Qué estás intentando hacer es algo como esto? ::

#!/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
carcaj
fuente
5
Sin embargo, tenga en cuenta que '-' como marcador de posición para stdout no funciona en todas las versiones de awscli. Por ejemplo, la versión 1.2.9, que viene con ubuntu LTS 14.04.2, no lo admite.
antoniob
Lo mismo ocurre con eso. Estoy en Ubuntu 12.xy no funciona en mi instancia de bash.
Kode Charlie
El problema con esto es que no puede obtener una versión específica del archivo.
Eamorr
no funciona en MacOS High Sierra 10.13.6 o bien ( aws --version: aws-cli/1.15.40 Python/3.6.5 Darwin/17.7.0 botocore/1.10.40)
MichaelChirico
esta respuesta también tiene la ventaja de que el contenido del archivo se transmitirá a su terminal y no se copiará como un todo. ver más en loige.co/aws-command-line-s3-content-from-stdin-or-to-stdout/…
Khoa
47

Si está utilizando una versión de la AWS CLI que no admite la copia en "-", también puede utilizar / dev / stdout:

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

También puede querer que la --quietbandera evite que una línea de resumen como la siguiente se agregue a su salida:

descargar: s3: //mybucket/stream.txt a ../../dev/stdout

Dibujó
fuente
1

Puede intentar usar s3streamcat , también es compatible con los formatos bzip, gzip y xz.

Instalar con

sudo pip install s3streamcat

Uso:

s3streamcat s3://bucketname/dir/file_path
s3streamcat s3://bucketname/dir/file_path | more
s3streamcat s3://bucketname/dir/file_path | grep something
Samarth
fuente
-3

Si desea lograr esto usando BASH, deberá llamar a una aplicación externa como la AWS Command-Line Interface (CLI). No tiene un equivalente CAT, por lo que deberá copiar el archivo localmente y luego CAT.

Alternativamente, puede usar / escribir una aplicación que llame directamente al AWS SDK, que está disponible para lenguajes como Python, PHP, Java. Al usar el SDK, el contenido del archivo se puede recuperar en la memoria y luego enviarlo a la salida estándar.

John Rotenstein
fuente
La respuesta anterior enumera que puede usar 'cp' con '-' como el segundo argumento de archivo para que envíe el archivo a stdout.
Asfand Qazi