¿Forma rápida de listar todos los archivos en el bucket de Amazon S3?
151
Tengo un cubo amazon s3 que tiene decenas de miles de nombres de archivo. ¿Cuál es la forma más fácil de obtener un archivo de texto que enumere todos los nombres de archivo en el depósito?
Como aludió el comentario de jldupont sobre la respuesta proporcionada por vdaubry, boto.s3.bucketlistresultset.BucketListResultSetaborda la condición de "decenas de miles de nombres de archivos" mencionada en la pregunta.
chb
1
Tenga en cuenta que para los cubos con una gran cantidad de objetos, digamos millones o miles de millones, los enfoques de codificación / scripting a continuación no funcionarán bien. En su lugar, debe habilitar el inventario S3 y recuperar un informe de inventario.
Si obtiene: boto.exception.S3ResponseError: S3ResponseError: 403 Prohibido Asegúrese de que la política de usuario para la clave de Acceso / Secreto tenga acceso al S3.
AWS ha lanzado recientemente sus herramientas de línea de comandos. Esto funciona de manera muy similar a boto y se puede instalar usando sudo easy_install awscliosudo pip install awscli
Una vez que haya instalado, simplemente puede ejecutar
s3cmddevuelve los nombres de archivo ordenados por fecha. ¿Hay alguna forma en que pueda hacer que vuelva, digamos solo aquellos archivos que se han agregado después 2015-10-23 20:46?
SexyBeast
Tenga en cuenta que si los nombres de archivo tienen espacios, esto tiene una pequeña falla, pero no tengo el awk-foo para solucionarlo
Colin D
36
Tenga cuidado, amazon list solo devuelve 1000 archivos. Si desea iterar sobre todos los archivos, debe paginar los resultados con marcadores:
Esto funciona pero no es realmente lo que necesito. Simplemente enumera todos los prefijos de "nivel superior". ¿Hay alguna manera de obtener todos los objetos en un cubo, prefijos y todo?
@rinogo Quizás no se ajuste a tus necesidades ... pero funciona y eso es lo que cuenta aquí. Se ajusta a la necesidad de otras personas como respuesta correcta.
Khalil Gharbaoui
Como dije, funciona, ¡gracias! Pero no responde la pregunta de OP. OP solicitó una forma de "[enumerar] todos los nombres de archivo en el depósito". Esto solo enumera los objetos de nivel superior, no todos los objetos.
rinogo
2
Ajá pero eso no es difícil de hacer. Simplemente agregue '--recursive' al comando. Lo
agregaré
12
Para los desarrolladores de Scala, aquí es una función recursiva ejecutar un escaneo completo y asignar el contenido de un bucket de AmazonS3 usando el SDK oficial de AWS para Java
Para invocar la map()función currículum anterior , simplemente pase el objeto AmazonS3Client ya construido (e inicializado correctamente) (consulte el AWS SDK oficial para Java API Reference ), el nombre del depósito y el nombre del prefijo en la primera lista de parámetros. También pase la función f()que desea aplicar para asignar cada resumen de objeto en la segunda lista de parámetros.
Por ejemplo
val keyOwnerTuples = map(s3, bucket, prefix)(s =>(s.getKey, s.getOwner))
devolverá la lista completa de (key, owner)tuplas en ese cubo / prefijo
si aws ya está configurado, uno puede reemplazar las líneas 2 y 3 cons3 = boto3.resource('s3')
sinapan
Si tiene colocadas las variables de entorno, no necesita usar las variables en el sessionmétodo. AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID']AWS_SECRET_ACCESS_KEY = os.environ['AWS_SECRET_ACCESS_KEY']
Flavio
7
Después de zach también recomendaría boto , pero necesitaba hacer una ligera diferencia en su código:
conn = boto.connect_s3('access-key', 'secret'key')
bucket = conn.lookup('bucket-name')
for key in bucket:
print key.name
Hay una API más simple disponible, que toma el nombre del depósito y enumera los objetos presentes en él. ObjectListing objects = s3client.listObjects (bucketName) El enlace javadoc se proporciona a continuación, docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/…
Rajesh
2
Codifique en Python usando la impresionante lib "boto" . El código devuelve una lista de archivos en un depósito y también maneja excepciones para depósitos perdidos.
import boto
conn = boto.connect_s3(<ACCESS_KEY>,<SECRET_KEY>)try:
bucket = conn.get_bucket(<BUCKET_NAME>, validate =True)except boto.exception.S3ResponseError, e:
do_something()# The bucket does not exist, choose how to deal with it or raise the exceptionreturn[ key.name.encode("utf-8")for key in bucket.list()]
No olvide reemplazar los <PLACE_HOLDERS> con sus valores.
Alternativamente, puede usar Minio Client, también conocido como mc. Es de código abierto y compatible con AWS S3. Está disponible para Linux, Windows, Mac, FreeBSD.
Todo lo que tienes que hacer es ejecutar mc ls para enumerar los contenidos.
Configuración de credenciales de AWS con Minio Client
$ mc host de configuración agregar mys3 https://s3.amazonaws.com BKIKJAA5BMMU2RHO6IBB V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12
Nota: Reemplace mys3 con el alias que desee para esta cuenta y, BKIKJAA5BMMU2RHO6IBB, V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12 con su AWS ACCESS-KEY y SECRET-KEY
Gracias por este fragmento de código, que puede proporcionar una ayuda limitada e inmediata. Una explicación adecuada mejoraría en gran medida su valor a largo plazo al mostrar por qué esta es una buena solución al problema y lo haría más útil para futuros lectores con otras preguntas similares. Por favor, editar su respuesta a añadir un poco de explicación, incluyendo los supuestos realizados.
Toby Speight
0
Versión simplificada y actualizada de la respuesta Scala de Paolo:
La forma MÁS FÁCIL de obtener un archivo de texto muy útil es descargar S3 Browser http://s3browser.com/ y usar el generador de URLs web para producir una lista de rutas de enlace completas. Es muy útil e implica unos 3 clics.
boto.s3.bucketlistresultset.BucketListResultSet
aborda la condición de "decenas de miles de nombres de archivos" mencionada en la pregunta.Respuestas:
Recomiendo usar boto . Entonces es un par de líneas rápidas de python :
Guarde esto como list.py, abra una terminal y luego ejecute:
fuente
AWS CLI
Documentación para aws s3 ls
AWS ha lanzado recientemente sus herramientas de línea de comandos. Esto funciona de manera muy similar a boto y se puede instalar usando
sudo easy_install awscli
osudo pip install awscli
Una vez que haya instalado, simplemente puede ejecutar
Que le mostrará todos sus cubos disponibles
Luego puede consultar un depósito específico para archivos.
Comando :
Salida :
Esto le mostrará todos sus archivos.
fuente
--recursive
bandera para ver todos los objetos en el directorio especificados3cmd es invaluable para este tipo de cosas
$ s3cmd ls -r s3://yourbucket/ | awk '{print $4}' > objects_in_bucket
fuente
s3cmd
devuelve los nombres de archivo ordenados por fecha. ¿Hay alguna forma en que pueda hacer que vuelva, digamos solo aquellos archivos que se han agregado después2015-10-23 20:46
?Tenga cuidado, amazon list solo devuelve 1000 archivos. Si desea iterar sobre todos los archivos, debe paginar los resultados con marcadores:
En rubí usando aws-s3
final
Espero que esto ayude, Vincent
fuente
Actualización 15-02-2019:
Este comando le dará una lista de todos los depósitos en AWS S3:
aws s3 ls
Este comando le dará una lista de todos los objetos de nivel superior dentro de un depósito de AWS S3:
aws s3 ls bucket-name
Este comando le dará una lista de TODOS los objetos dentro de un depósito de AWS S3:
aws s3 ls bucket-name --recursive
Este comando colocará una lista de TODOS dentro de un depósito de AWS S3 ... dentro de un archivo de texto en su directorio actual:
aws s3 ls bucket-name --recursive | cat >> file-name.txt
fuente
Para los desarrolladores de Scala, aquí es una función recursiva ejecutar un escaneo completo y asignar el contenido de un bucket de AmazonS3 usando el SDK oficial de AWS para Java
Para invocar la
map()
función currículum anterior , simplemente pase el objeto AmazonS3Client ya construido (e inicializado correctamente) (consulte el AWS SDK oficial para Java API Reference ), el nombre del depósito y el nombre del prefijo en la primera lista de parámetros. También pase la funciónf()
que desea aplicar para asignar cada resumen de objeto en la segunda lista de parámetros.Por ejemplo
devolverá la lista completa de
(key, owner)
tuplas en ese cubo / prefijoo
como normalmente te acercarías mónadas en la programación funcional
fuente
mapped.toList
sin ninguno de los anterioresacc
Hay dos formas de hacerlo. Usando Python
Otra forma es usar AWS cli para ello
fuente
s3 = boto3.resource('s3')
session
método.AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID']
AWS_SECRET_ACCESS_KEY = os.environ['AWS_SECRET_ACCESS_KEY']
Después de zach también recomendaría boto , pero necesitaba hacer una ligera diferencia en su código:
fuente
conn.lookup
regresa enNone
lugar de arrojar unS3ResponseError(NoSuchBucket)
errorPara obtener más detalles, consulte aquí: http://docs.aws.amazon.com/cli/latest/reference/s3api/list-objects.html
fuente
aws s3api list-objects --bucket <bucket-name>
Para el boto3 de Python después de haber usado
aws configure
:fuente
En primer lugar asegurarse de que están en una
instance terminal
y tieneall access
deS3
enIAM
que está utilizando. Por ejemplo, usé una instancia ec2.Luego configure aws
Luego complete los credenciales ej: -
Ahora, mira todos los cubos
Almacenar todos los nombres de cubos
Ver toda la estructura de archivos en un cubo
Almacene la estructura de archivos en cada cubo
Espero que esto ayude.
fuente
AWS CLI puede permitirle ver todos los archivos de un bucket de S3 rápidamente y ayudarlo a realizar otras operaciones también.
Para usar AWS CLI, siga los pasos a continuación:
Para ver todos los archivos de un depósito S3, use el comando
aws s3 ls s3: // your_bucket_name --recursive
Referencia para usar AWS cli para diferentes servicios de AWS: https://docs.aws.amazon.com/cli/latest/reference/
fuente
En Java, puede obtener las claves utilizando ListObjects (consulte la documentación de AWS )
fuente
Codifique en Python usando la impresionante lib "boto" . El código devuelve una lista de archivos en un depósito y también maneja excepciones para depósitos perdidos.
No olvide reemplazar los <PLACE_HOLDERS> con sus valores.
fuente
El siguiente comando obtendrá todos los nombres de archivo de su bucket de AWS S3 y escribirá en el archivo de texto en su directorio actual:
fuente
Alternativamente, puede usar Minio Client, también conocido como mc. Es de código abierto y compatible con AWS S3. Está disponible para Linux, Windows, Mac, FreeBSD.
Todo lo que tienes que hacer es ejecutar mc ls para enumerar los contenidos.
Nota:
Instalación de Minio Client Linux Descargue mc para:
Configuración de credenciales de AWS con Minio Client
Nota: Reemplace mys3 con el alias que desee para esta cuenta y, BKIKJAA5BMMU2RHO6IBB, V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12 con su AWS ACCESS-KEY y SECRET-KEY
Espero eso ayude.
Descargo de responsabilidad: trabajo para Minio
fuente
Puede usar la API estándar s3:
fuente
Puede enumerar todos los archivos, en el bucket aws s3 usando el comando
y para guardarlo en un archivo, use
si desea agregar su resultado en un archivo, de lo contrario:
si quieres borrar lo que se escribió antes.
Funcionará tanto en Windows como en Linux.
fuente
En javascript puedes usar
s3.listObjects (params, function (err, result) {});
para obtener todos los objetos dentro del cubo. debe pasar el nombre del depósito dentro de los parámetros (Depósito: nombre) .
fuente
fuente
fuente
Versión simplificada y actualizada de la respuesta Scala de Paolo:
Eliminando los genéricos y usando ListObjectRequest generado por los constructores SDK.
fuente
fuente
En PHP, puede obtener una lista completa de objetos AWS-S3 dentro de un depósito específico utilizando la siguiente llamada
Puede redirigir la salida del código anterior a un archivo para obtener una lista de claves.
fuente
Use plumbum para envolver el cli y tendrá una sintaxis clara:
fuente
por favor prueba este script bash. utiliza el comando curl sin necesidad de dependencias externas
fuente
La forma MÁS FÁCIL de obtener un archivo de texto muy útil es descargar S3 Browser http://s3browser.com/ y usar el generador de URLs web para producir una lista de rutas de enlace completas. Es muy útil e implica unos 3 clics.
La mejor de las suertes para ti.
fuente