Maneira rápida de listar todos os arquivos no bucket do Amazon S3?
151
Eu tenho um Amazon S3 bucket que possui dezenas de milhares de nomes de arquivos. Qual é a maneira mais fácil de obter um arquivo de texto que lista todos os nomes de arquivos no bucket?
Como mencionado no comentário de jldupont sobre a resposta fornecida pelo vdaubry, boto.s3.bucketlistresultset.BucketListResultSettrata da condição "dezenas de milhares de nomes de arquivos" mencionada na pergunta.
chb 29/05
1
Esteja ciente de que, para depósitos com um número muito grande de objetos, digamos milhões ou bilhões, as abordagens de codificação / script abaixo não funcionarão bem. Você deve ativar o S3 Inventory e recuperar um relatório de inventário.
Se você obtiver: boto.exception.S3ResponseError: S3ResponseError: 403 Proibido Verifique se a política do usuário da chave de Acesso / Segredo tem acesso ao S3.
A AWS lançou recentemente suas ferramentas de linha de comando. Isso funciona como o boto e pode ser instalado usando sudo easy_install awscliousudo pip install awscli
Depois de instalar, você pode simplesmente executar
s3cmdretorna os nomes de arquivos classificados por data. Existe alguma maneira de fazê-lo retornar, digamos apenas os arquivos que foram adicionados depois 2015-10-23 20:46?
SexyBeast #
Note-se que se os nomes de arquivos têm espaços isto tem uma pequena falha, mas eu não tenho o awk-foo para corrigi-lo
Colin D
36
Cuidado, a lista da Amazon retorna apenas 1000 arquivos. Se você deseja iterar sobre todos os arquivos, pagine os resultados usando marcadores:
Isso funciona, mas não é realmente o que eu preciso. Apenas lista todos os prefixos "de nível superior". Existe uma maneira de obter todos os objetos em um balde, prefixos e tudo?
@rinogo Talvez não atenda às suas necessidades ... mas funciona e é isso que conta aqui. Cabe às necessidades de outras pessoas como resposta correta.
Khalil Gharbaoui
Como eu disse, funciona - obrigado! Mas isso não responde à pergunta do OP. O OP pediu uma maneira de "[listar] todos os nomes de arquivos no balde". Isso lista apenas objetos de nível superior, nem todos os objetos.
Rinogo 14/02/19
2
Ah, mas isso não é difícil de fazer. Basta adicionar '--recursive' ao comando. Vou adicioná-lo para a minha resposta obrigado por apontar isso
Khalil Gharbaoul
12
Para desenvolvedores do Scala, aqui é uma função recursiva executar uma verificação completa e mapear o conteúdo de um bucket do AmazonS3 usando o AWS SDK oficial para Java
Para invocar a map()função ao curry acima , basta passar o objeto AmazonS3Client já construído (e inicializado corretamente) (consulte a referência oficial da API do AWS SDK para Java ), o nome do bucket e o nome do prefixo na primeira lista de parâmetros. Passe também a função que f()você deseja aplicar para mapear cada resumo de objeto na segunda lista de parâmetros.
Por exemplo
val keyOwnerTuples = map(s3, bucket, prefix)(s =>(s.getKey, s.getOwner))
retornará a lista completa de (key, owner)tuplas nesse intervalo / prefixo
AWS se já está configurado, pode-se substituir as linhas 2 e 3, coms3 = boto3.resource('s3')
sinapan
Se você tiver as variáveis de ambiente colocadas, não precisará usar as variáveis no sessionmétodo AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID']AWS_SECRET_ACCESS_KEY = os.environ['AWS_SECRET_ACCESS_KEY']
Flavio
7
Depois do zach, eu também recomendaria o boto , mas eu precisava fazer uma pequena diferença no código dele:
conn = boto.connect_s3('access-key', 'secret'key')
bucket = conn.lookup('bucket-name')
for key in bucket:
print key.name
Há mais uma API simples disponível, que pega o nome do bucket e lista os objetos presentes nele. ObjectListing objects = s3client.listObjects (bucketName) O link javadoc é fornecido abaixo, docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/…
Rajesh
2
Codifique em python usando a incrível biblioteca "boto" . O código retorna uma lista de arquivos em um bucket e também lida com exceções para os buckets ausentes.
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()]
Não se esqueça de substituir <PLACE_HOLDERS> pelos seus valores.
Como alternativa, você pode usar o Minio Client, também conhecido como mc. É de código aberto e compatível com o AWS S3. Está disponível para Linux, Windows, Mac, FreeBSD.
Tudo que você precisa fazer é executar o comando mc ls para listar o conteúdo.
Configurando credenciais da AWS com o Minio Client
host de configuração do $ mc add mys3 https://s3.amazonaws.com BKIKJAA5BMMU2RHO6IBB V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12
Nota: Substitua mys3 pelo alias desejado para esta conta e, BKIKJAA5BMMU2RHO6IBB, V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12 pelo AWS ACCESS-KEY e SECRET-KEY
Espero que ajude.
Isenção de responsabilidade: eu trabalho para o Minio
Obrigado por este trecho de código, que pode fornecer ajuda imediata e limitada. Uma explicação adequada melhoraria bastante seu valor a longo prazo, mostrando por que essa é uma boa solução para o problema e a tornaria mais útil para futuros leitores com outras perguntas semelhantes. Por favor edite sua resposta para adicionar alguma explicação, incluindo as suposições que você fez.
precisa
0
Versão simplificada e atualizada da resposta Scala de Paolo:
A maneira MAIS FÁCIL de obter um arquivo de texto muito utilizável é baixar o S3 Browser http://s3browser.com/ e usar o Gerador de URLs da Web para produzir uma lista de caminhos completos do link. É muito útil e envolve cerca de 3 cliques.
boto.s3.bucketlistresultset.BucketListResultSet
trata da condição "dezenas de milhares de nomes de arquivos" mencionada na pergunta.Respostas:
Eu recomendo usar o boto . Então são algumas linhas rápidas de python :
Salve isso como list.py, abra um terminal e execute:
fonte
CLI da AWS
Documentação para aws s3 ls
A AWS lançou recentemente suas ferramentas de linha de comando. Isso funciona como o boto e pode ser instalado usando
sudo easy_install awscli
ousudo pip install awscli
Depois de instalar, você pode simplesmente executar
O que mostrará todos os seus baldes disponíveis
Em seguida, você pode consultar um intervalo específico para arquivos.
Comando :
Saída :
Isso mostrará todos os seus arquivos.
fonte
--recursive
bandeira para ver todos os objetos sob o diretório especificados3cmd é inestimável para esse tipo de coisa
$ s3cmd ls -r s3://yourbucket/ | awk '{print $4}' > objects_in_bucket
fonte
s3cmd
retorna os nomes de arquivos classificados por data. Existe alguma maneira de fazê-lo retornar, digamos apenas os arquivos que foram adicionados depois2015-10-23 20:46
?Cuidado, a lista da Amazon retorna apenas 1000 arquivos. Se você deseja iterar sobre todos os arquivos, pagine os resultados usando marcadores:
Em ruby usando o aws-s3
fim
Espero que isso ajude, vincent
fonte
Atualização 15-02-2019:
Este comando fornecerá uma lista de todos os buckets no AWS S3:
aws s3 ls
Este comando fornecerá uma lista de todos os objetos de nível superior dentro de um bucket do AWS S3:
aws s3 ls bucket-name
Este comando fornecerá uma lista de TODOS os objetos dentro de um bucket do AWS S3:
aws s3 ls bucket-name --recursive
Este comando colocará uma lista de ALL dentro de um bucket do AWS S3 ... dentro de um arquivo de texto em seu diretório atual:
aws s3 ls bucket-name --recursive | cat >> file-name.txt
fonte
Para desenvolvedores do Scala, aqui é uma função recursiva executar uma verificação completa e mapear o conteúdo de um bucket do AmazonS3 usando o AWS SDK oficial para Java
Para invocar a
map()
função ao curry acima , basta passar o objeto AmazonS3Client já construído (e inicializado corretamente) (consulte a referência oficial da API do AWS SDK para Java ), o nome do bucket e o nome do prefixo na primeira lista de parâmetros. Passe também a função quef()
você deseja aplicar para mapear cada resumo de objeto na segunda lista de parâmetros.Por exemplo
retornará a lista completa de
(key, owner)
tuplas nesse intervalo / prefixoou
como você normalmente abordaria por mônadas na programação funcional
fonte
mapped.toList
sem qualquer do anterioracc
Existem algumas maneiras de fazer isso. Usando Python
Outra maneira é usar o AWS cli para isso
fonte
s3 = boto3.resource('s3')
session
métodoAWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID']
AWS_SECRET_ACCESS_KEY = os.environ['AWS_SECRET_ACCESS_KEY']
Depois do zach, eu também recomendaria o boto , mas eu precisava fazer uma pequena diferença no código dele:
fonte
conn.lookup
retornaNone
ao invés de lançar umS3ResponseError(NoSuchBucket)
erroPara mais detalhes, consulte aqui - http://docs.aws.amazon.com/cli/latest/reference/s3api/list-objects.html
fonte
aws s3api list-objects --bucket <bucket-name>
Para o boto3 do Python depois de ter usado
aws configure
:fonte
Primeiro verifique se você está em um
instance terminal
e você temall access
deS3
emIAM
que você está usando. Por exemplo, usei uma instância ec2.Em seguida, configure o aws
Em seguida, preencha os critérios externos ex: -
Agora, veja todos os baldes
Armazenar o nome de todos os buckets
Veja toda a estrutura de arquivos em um bucket
Armazene a estrutura de arquivos em cada bloco
Espero que isto ajude.
fonte
A AWS CLI pode permitir que você veja todos os arquivos de um bucket S3 rapidamente e também ajuda na execução de outras operações.
Para usar a CLI da AWS, siga as etapas abaixo:
Para ver todos os arquivos de um bucket S3, use o comando
aws s3 ls s3: // your_bucket_name --recursive
Referência para usar o AWS cli para diferentes serviços da AWS: https://docs.aws.amazon.com/cli/latest/reference/
fonte
Em Java, você pode obter as chaves usando o ListObjects (consulte a documentação da AWS )
fonte
Codifique em python usando a incrível biblioteca "boto" . O código retorna uma lista de arquivos em um bucket e também lida com exceções para os buckets ausentes.
Não se esqueça de substituir <PLACE_HOLDERS> pelos seus valores.
fonte
O comando abaixo obterá todos os nomes de arquivo do seu bucket do AWS S3 e gravará no arquivo de texto no diretório atual:
fonte
Como alternativa, você pode usar o Minio Client, também conhecido como mc. É de código aberto e compatível com o AWS S3. Está disponível para Linux, Windows, Mac, FreeBSD.
Tudo que você precisa fazer é executar o comando mc ls para listar o conteúdo.
Nota:
Instalando o Minio Client Linux Download mc para:
Configurando credenciais da AWS com o Minio Client
Nota: Substitua mys3 pelo alias desejado para esta conta e, BKIKJAA5BMMU2RHO6IBB, V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12 pelo AWS ACCESS-KEY e SECRET-KEY
Espero que ajude.
Isenção de responsabilidade: eu trabalho para o Minio
fonte
Você pode usar a API padrão s3 -
fonte
Você pode listar todos os arquivos no bucket do aws s3 usando o comando
e para salvá-lo em um arquivo, use
se você deseja anexar seu resultado em um arquivo, caso contrário:
se você quiser limpar o que foi escrito antes.
Funcionará tanto no Windows quanto no Linux.
fonte
Em javascript você pode usar
s3.listObjects (parâmetros, função (erro, resultado) {});
para colocar todos os objetos dentro do balde. você precisa passar o nome do bucket dentro dos parâmetros (Bucket: name) .
fonte
fonte
fonte
Versão simplificada e atualizada da resposta Scala de Paolo:
Removendo os genéricos e usando o ListObjectRequest gerado pelos construtores do SDK.
fonte
fonte
No PHP, você pode obter uma lista completa dos objetos do AWS-S3 dentro do bucket específico usando a seguinte chamada
Você pode redirecionar a saída do código acima para um arquivo para obter a lista de chaves.
fonte
Use plumbum para quebrar o cli e você terá uma sintaxe clara:
fonte
por favor, tente este script bash. ele usa o comando curl sem precisar de dependências externas
fonte
A maneira MAIS FÁCIL de obter um arquivo de texto muito utilizável é baixar o S3 Browser http://s3browser.com/ e usar o Gerador de URLs da Web para produzir uma lista de caminhos completos do link. É muito útil e envolve cerca de 3 cliques.
Boa sorte para você.
fonte