Un moyen rapide de répertorier tous les fichiers dans le compartiment Amazon S3?
151
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 du compartiment?
Comme l'indique le commentaire de jldupont sur la réponse fournie par vdaubry, boto.s3.bucketlistresultset.BucketListResultSetaborde la condition des «dizaines de milliers de noms de fichiers» mentionnée dans la question.
chb
1
Sachez que pour les buckets avec un très grand nombre d'objets, disons des millions ou des milliards, les approches de codage / script ci-dessous ne fonctionneront pas bien. Vous devez à la place activer l'inventaire S3 et récupérer un rapport d'inventaire.
Si vous obtenez: boto.exception.S3ResponseError: S3ResponseError: 403 Forbidden Assurez-vous que la stratégie utilisateur pour la clé d'accès / secret a accès au S3.
AWS a récemment publié ses outils de ligne de commande. Cela fonctionne un peu comme boto et peut être installé en utilisant sudo easy_install awscliousudo pip install awscli
Une fois que vous avez installé, vous pouvez alors simplement exécuter
s3cmdrenvoie les noms de fichiers triés par date. Y a-t-il un moyen de le faire revenir en disant uniquement les fichiers qui ont été ajoutés après 2015-10-23 20:46?
SexyBeast
Notez que si les noms de fichiers ont des espaces, cela a un petit problème mais je n'ai pas le awk-foo pour le réparer
Colin D
36
Attention, la liste Amazon ne renvoie que 1000 fichiers. Si vous souhaitez parcourir tous les fichiers, vous devez paginer les résultats à l'aide de marqueurs:
Cela fonctionne mais ce n'est pas vraiment ce dont j'ai besoin. Il répertorie simplement tous les préfixes "de premier niveau". Existe-t-il un moyen d'obtenir tous les objets dans un seau, les préfixes et tout?
@rinogo Cela ne correspond peut-être pas à vos besoins ... mais cela fonctionne et c'est ce qui compte ici. Cela correspond aux besoins des autres personnes en tant que réponse correcte.
Khalil Gharbaoui
Comme je l'ai dit, cela fonctionne - merci! Mais cela ne répond pas à la question d'OP. OP a demandé un moyen de "[lister] tous les noms de fichiers dans le compartiment". Cela répertorie uniquement les objets de niveau supérieur, pas tous les objets.
rinogo le
2
Ah mais ce n'est pas difficile à faire. Ajoutez simplement «--recursive» à la commande. Je vais l'ajouter à ma réponse, merci de l'avoir signalé
Khalil Gharbaoui
12
Pour les développeurs Scala, il s'agit ici d'une fonction récursive permettant d'exécuter une analyse complète et de mapper le contenu d'un bucket AmazonS3 à l'aide du SDK AWS officiel pour Java
Pour appeler la map()fonction curry ci-dessus , transmettez simplement l'objet AmazonS3Client déjà construit (et correctement initialisé) (reportez-vous au AWS SDK for Java API Reference ), le nom du compartiment et le nom du préfixe dans la première liste de paramètres. Passez également la fonctionf() vous souhaitez appliquer pour mapper chaque résumé d'objet dans la deuxième liste de paramètres.
Par exemple
val keyOwnerTuples = map(s3, bucket, prefix)(s =>(s.getKey, s.getOwner))
renverra la liste complète des (key, owner)tuples dans ce compartiment / préfixe
si aws est déjà configuré, on peut remplacer les lignes 2 et 3 pars3 = boto3.resource('s3')
sinapan
Si vous avez placé les variables d'environnement, vous n'avez pas besoin d'utiliser les variables de la sessionméthode. AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID']AWS_SECRET_ACCESS_KEY = os.environ['AWS_SECRET_ACCESS_KEY']
Flavio
7
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
D' abord , assurez - vous que vous êtes sur un instance terminalet vous avez all accessde S3en IAMvous utilisez. Par exemple, j'ai utilisé une instance ec2.
pip3 install awscli
Ensuite, configurez aws
aws configure
Ensuite, remplissez les références ex: -
$ aws configure
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: us-west-2
Default output format [None]: json (or just press enter)
Maintenant, voir tous les seaux
aws s3 ls
Stocker le nom de tous les buckets
aws s3 ls > output.txt
Voir toute la structure de fichiers dans un bucket
aws s3 ls bucket-name --recursive
Stocker la structure des fichiers dans chaque compartiment
aws s3 ls bucket-name --recursive > file_Structure.txt
Il existe une autre API simple disponible, qui prend le nom du compartiment et répertorie les objets qui y sont présents. ObjectListing objects = s3client.listObjects (bucketName) Le lien javadoc est donné ci-dessous, docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/…
Rajesh
2
Code en python en utilisant l'impressionnante lib "boto" . Le code renvoie une liste de fichiers dans un compartiment et gère également les exceptions pour les compartiments manquants.
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'oubliez pas de remplacer <PLACE_HOLDERS> par vos valeurs.
Configuration des informations d'identification AWS avec Minio Client
$ mc config host ajouter mys3 https://s3.amazonaws.com BKIKJAA5BMMU2RHO6IBB V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12
Remarque: veuillez remplacer mys3 par l'alias que vous souhaitez pour ce compte et, BKIKJAA5BMMU2RHO6IBB, V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12 avec votre AWS ACCESS-KEY et SECRET-KEY
J'espère que ça aide.
Clause de non-responsabilité: je travaille pour Minio
Merci pour cet extrait de code, qui pourrait fournir une aide limitée et immédiate. Une explication appropriée améliorerait considérablement sa valeur à long terme en montrant pourquoi c'est une bonne solution au problème, et la rendrait plus utile aux futurs lecteurs avec d'autres questions similaires. Veuillez modifier votre réponse pour ajouter des explications, y compris les hypothèses que vous avez formulées.
Toby Speight
0
Version simplifiée et mise à jour de la réponse Scala de Paolo:
Le moyen le plus simple d'obtenir un fichier texte très utilisable est de télécharger le navigateur S3 http://s3browser.com/ et d'utiliser le générateur d'URL Web pour produire une liste de chemins de liens complets. Il est très pratique et implique environ 3 clics.
boto.s3.bucketlistresultset.BucketListResultSet
aborde la condition des «dizaines de milliers de noms de fichiers» mentionnée dans la question.Réponses:
Je recommanderais d'utiliser boto . Ensuite, c'est quelques lignes rapides de python :
Enregistrez-le sous list.py, ouvrez un terminal, puis exécutez:
la source
AWS CLI
Documentation pour AWS S3 LS
AWS a récemment publié ses outils de ligne de commande. Cela fonctionne un peu comme boto et peut être installé en utilisant
sudo easy_install awscli
ousudo pip install awscli
Une fois que vous avez installé, vous pouvez alors simplement exécuter
Qui vous montrera tous vos seaux disponibles
Vous pouvez ensuite interroger un compartiment spécifique pour les fichiers.
Commande :
Sortie :
Cela vous montrera tous vos fichiers.
la source
--recursive
drapeau pour voir tous les objets dans le répertoire spécifiés3cmd est inestimable pour ce genre de chose
$ s3cmd ls -r s3://yourbucket/ | awk '{print $4}' > objects_in_bucket
la source
s3cmd
renvoie les noms de fichiers triés par date. Y a-t-il un moyen de le faire revenir en disant uniquement les fichiers qui ont été ajoutés après2015-10-23 20:46
?Attention, la liste Amazon ne renvoie que 1000 fichiers. Si vous souhaitez parcourir tous les fichiers, vous devez paginer les résultats à l'aide de marqueurs:
En rubis avec aws-s3
fin
J'espère que cela aide, Vincent
la source
Mise à jour 15-02-2019:
Cette commande vous donnera une liste de tous les compartiments dans AWS S3:
aws s3 ls
Cette commande vous donnera une liste de tous les objets de niveau supérieur dans un compartiment AWS S3:
aws s3 ls bucket-name
Cette commande vous donnera une liste de TOUS les objets dans un compartiment AWS S3:
aws s3 ls bucket-name --recursive
Cette commande placera une liste de TOUS dans un compartiment AWS S3 ... dans un fichier texte dans votre répertoire actuel:
aws s3 ls bucket-name --recursive | cat >> file-name.txt
la source
Pour les développeurs Scala, il s'agit ici d'une fonction récursive permettant d'exécuter une analyse complète et de mapper le contenu d'un bucket AmazonS3 à l'aide du SDK AWS officiel pour Java
Pour appeler la
map()
fonction curry ci-dessus , transmettez simplement l'objet AmazonS3Client déjà construit (et correctement initialisé) (reportez-vous au AWS SDK for Java API Reference ), le nom du compartiment et le nom du préfixe dans la première liste de paramètres. Passez également la fonctionf()
vous souhaitez appliquer pour mapper chaque résumé d'objet dans la deuxième liste de paramètres.Par exemple
renverra la liste complète des
(key, owner)
tuples dans ce compartiment / préfixeou
comme vous le feriez normalement avec les Monades dans la programmation fonctionnelle
la source
mapped.toList
sans aucun des précédentsacc
Il y a plusieurs façons de procéder. Utiliser Python
Une autre façon consiste à utiliser AWS cli pour cela
la source
s3 = boto3.resource('s3')
session
méthode.AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID']
AWS_SECRET_ACCESS_KEY = os.environ['AWS_SECRET_ACCESS_KEY']
Après zach, je recommanderais également boto , mais je devais faire une légère différence dans son code:
la source
conn.lookup
renvoieNone
au lieu de lancer uneS3ResponseError(NoSuchBucket)
erreurPour plus de détails, voir ici - http://docs.aws.amazon.com/cli/latest/reference/s3api/list-objects.html
la source
aws s3api list-objects --bucket <bucket-name>
Pour le boto3 de Python après avoir utilisé
aws configure
:la source
D' abord , assurez - vous que vous êtes sur un
instance terminal
et vous avezall access
deS3
enIAM
vous utilisez. Par exemple, j'ai utilisé une instance ec2.Ensuite, configurez aws
Ensuite, remplissez les références ex: -
Maintenant, voir tous les seaux
Stocker le nom de tous les buckets
Voir toute la structure de fichiers dans un bucket
Stocker la structure des fichiers dans chaque compartiment
J'espère que cela t'aides.
la source
AWS CLI peut vous permettre de voir rapidement tous les fichiers d'un compartiment S3 et vous aider à effectuer d'autres opérations également.
Pour utiliser l'AWS CLI, suivez les étapes ci-dessous:
Pour voir tous les fichiers d'un compartiment S3, utilisez la commande
aws s3 ls s3: // votre_nom_bucket --recursive
Référence pour utiliser AWS cli pour différents services AWS: https://docs.aws.amazon.com/cli/latest/reference/
la source
En Java, vous pouvez obtenir les clés à l'aide de ListObjects (voir la documentation AWS )
la source
Code en python en utilisant l'impressionnante lib "boto" . Le code renvoie une liste de fichiers dans un compartiment et gère également les exceptions pour les compartiments manquants.
N'oubliez pas de remplacer <PLACE_HOLDERS> par vos valeurs.
la source
La commande ci-dessous obtiendra tous les noms de fichiers de votre compartiment AWS S3 et les écrit dans un fichier texte de votre répertoire actuel:
la source
Vous pouvez également utiliser Minio Client aka mc. Son Open Source et compatible avec AWS S3. Il est disponible pour Linux, Windows, Mac, FreeBSD.
Tout ce que vous avez à faire est d'exécuter la commande mc ls pour lister le contenu.
Remarque:
Installation de Minio Client Linux Téléchargez mc pour:
Configuration des informations d'identification AWS avec Minio Client
Remarque: veuillez remplacer mys3 par l'alias que vous souhaitez pour ce compte et, BKIKJAA5BMMU2RHO6IBB, V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12 avec votre AWS ACCESS-KEY et SECRET-KEY
J'espère que ça aide.
Clause de non-responsabilité: je travaille pour Minio
la source
Vous pouvez utiliser l'API s3 standard -
la source
Vous pouvez lister tous les fichiers, dans le bucket aws s3 en utilisant la commande
et pour l'enregistrer dans un fichier, utilisez
si vous souhaitez ajouter votre résultat dans un fichier sinon:
si vous voulez effacer ce qui a été écrit auparavant.
Cela fonctionnera à la fois sous Windows et Linux.
la source
En javascript, vous pouvez utiliser
s3.listObjects (paramètres, fonction (err, résultat) {});
pour obtenir tous les objets à l'intérieur du seau. vous devez passer le nom du compartiment dans les paramètres (Bucket: nom) .
la source
la source
la source
Version simplifiée et mise à jour de la réponse Scala de Paolo:
Suppression des génériques et utilisation du ListObjectRequest généré par les générateurs du SDK.
la source
la source
En PHP, vous pouvez obtenir la liste complète des objets AWS-S3 dans un compartiment spécifique à l'aide de l'appel suivant
Vous pouvez rediriger la sortie du code ci-dessus dans un fichier pour obtenir la liste des clés.
la source
Utilisez plumbum pour envelopper le cli et vous aurez une syntaxe claire:
la source
veuillez essayer ce script bash. il utilise la commande curl sans avoir besoin de dépendances externes
la source
Le moyen le plus simple d'obtenir un fichier texte très utilisable est de télécharger le navigateur S3 http://s3browser.com/ et d'utiliser le générateur d'URL Web pour produire une liste de chemins de liens complets. Il est très pratique et implique environ 3 clics.
Bonne chance à vous.
la source