162 votes

Un moyen rapide de lister tous les fichiers dans le seau Amazon S3 ?

J'ai un seau amazon s3 qui contient des dizaines de milliers de noms de fichiers. Quel est le moyen le plus simple d'obtenir un fichier texte qui répertorie tous les noms de fichiers dans le seau ?

0 votes

Comme l'indique le commentaire de jldupont sur la réponse fournie par vdaubry, boto.s3.bucketlistresultset.BucketListResultSet répond à la condition des "dizaines de milliers de noms de fichiers" mentionnée dans la question.

1 votes

Sachez que pour les buckets contenant un très grand nombre d'objets, par exemple des millions ou des milliards, les approches de codage/scripting ci-dessous ne fonctionneront pas bien. Vous devriez plutôt activer S3 Inventory et récupérer un rapport d'inventaire.

129voto

Zachary Ozer Points 1749

Je recommande d'utiliser boto . Ensuite, c'est un rapide quelques lignes de python :

from boto.s3.connection import S3Connection

conn = S3Connection('access-key','secret-access-key')
bucket = conn.get_bucket('bucket')
for key in bucket.list():
    print(key.name.encode('utf-8'))

Enregistrez ce fichier sous le nom de list.py, ouvrez un terminal, puis exécutez-le :

$ python list.py > results.txt

3 votes

Si vous obtenez : boto.exception.S3ResponseError : S3ResponseError : 403 Forbidden Assurez-vous que la politique utilisateur pour la clé Access/Secret a accès au S3.

1 votes

J'ai obtenu une erreur 403, et j'ai dû suivre ces instructions pour que cela fonctionne : stackoverflow.com/a/22462419/1143558

1 votes

Comment faire une boucle dans bash ?

69voto

Layke Points 10216

CLI D'AWS

Documentation pour aws s3 ls

AWS a récemment publié ses outils de ligne de commande. Cela fonctionne comme boto et peut être installé en utilisant sudo easy_install awscli o sudo pip install awscli

Une fois l'installation terminée, il vous suffit d'exécuter

aws s3 ls

Ce qui vous montrera tous les godets disponibles.

CreationTime Bucket
       ------------ ------
2013-07-11 17:08:50 mybucket
2013-07-24 14:55:44 mybucket2

Vous pouvez ensuite rechercher des fichiers dans un seau spécifique.

Commande :

aws s3 ls s3://mybucket

Sortie :

Bucket: mybucket
Prefix:

      LastWriteTime     Length Name
      -------------     ------ ----
                           PRE somePrefix/
2013-07-25 17:06:27         88 test.txt

Cela vous montrera tous vos fichiers.

18 votes

Ajouter le --recursive pour voir tous les objets sous le répertoire spécifié

2 votes

Y a-t-il un moyen d'analyser les noms ? Je cherche à faire une liste de fichiers dans un seau s3 pour les énumérer.

0 votes

En outre, s3 encode les noms de fichiers pour les utiliser comme URL, ce sont juste des noms de fichiers bruts

44voto

mat kelcey Points 1432

s3cmd est inestimable pour ce genre de choses

$ s3cmd ls -r s3://yourbucket/ | awk '{print $4}' > objects_in_bucket

1 votes

s3cmd renvoie les noms de fichiers triés par date. Existe-t-il un moyen de faire en sorte qu'il ne renvoie que les fichiers qui ont été ajoutés après la date d'entrée dans le système ? 2015-10-23 20:46 ?

0 votes

Notez que si les noms de fichiers contiennent des espaces, il y a un petit problème mais je n'ai pas l'awk-foo pour le résoudre.

40voto

vdaubry Points 6127

Attention, la liste d'Amazon ne renvoie que 1000 fichiers. Si vous voulez itérer sur tous les fichiers, vous devez paginer les résultats en utilisant des marqueurs :

En ruby, en utilisant aws-s3

bucket_name = 'yourBucket'
marker = ""

AWS::S3::Base.establish_connection!(
  :access_key_id => 'your_access_key_id',
  :secret_access_key => 'your_secret_access_key'
)

loop do
  objects = Bucket.objects(bucket_name, :marker=>marker, :max_keys=>1000)
  break if objects.size == 0
  marker = objects.last.key

  objects.each do |obj|
      puts "#{obj.key}"
  end
end

fin

J'espère que cela vous aidera, Vincent

7 votes

0 votes

Merci, j'ai eu du mal à trouver comment placer le marqueur :1 :

8voto

Datageek Points 2846

Après Zach, je recommanderais également boto mais je devais faire une légère différence dans son code :

conn = boto.connect_s3('access-key', 'secret'key')
bucket = conn.lookup('bucket-name')
for key in bucket:
    print key.name

3 votes

La modification était nécessaire car le code original ne fonctionnait pas à un moment donné.

1 votes

conn.lookup renvoie à None au lieu de lancer un S3ResponseError(NoSuchBucket) erreur

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X