J’ai un seau amazon s3 qui contient des dizaines de milliers de noms de fichiers. Quelle est la manière la plus simple d’obtenir un fichier texte répertoriant tous les noms de fichiers dans le compartiment?
Je recommande d’utiliser boto . Alors c’est un couple de lignes de python rapide:
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-le sous le nom list.py, ouvrez un terminal, puis exécutez:
$ python list.py > results.txt
s3cmd est inestimable pour ce genre de chose
$ s3cmd ls -r s3://yourbucket/ | awk '{print $4}' > objects_in_bucket
Documentation pour aws s3 ls
AWS a récemment publié ses outils de ligne de commande. Cela fonctionne beaucoup comme boto et peut être installé en utilisant sudo easy_install awscli
ou sudo pip install awscli
Une fois que vous avez installé, vous pouvez alors simplement exécuter
aws s3 ls
Qui vous montrera tous vos seaux disponibles
CreationTime Bucket ------------ ------ 2013-07-11 17:08:50 mybucket 2013-07-24 14:55:44 mybucket2
Vous pouvez ensuite interroger un compartiment spécifique pour les fichiers.
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.
Attention, la liste amazonienne ne renvoie que 1000 fichiers. Si vous souhaitez parcourir tous les fichiers, vous devez paginer les résultats en utilisant des marqueurs:
En rbuy avec 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 aide, Vincent
Pour les développeurs Scala, la fonction récursive consiste à exécuter une parsing complète et à mapper le contenu d’un compartiment AmazonS3 à l’aide du kit AWS SDK officiel pour Java.
import com.amazonaws.services.s3.AmazonS3Client import com.amazonaws.services.s3.model.{S3ObjectSummary, ObjectListing, GetObjectRequest} import scala.collection.JavaConversions.{collectionAsScalaIterable => asScala} def map[T](s3: AmazonS3Client, bucket: Ssortingng, prefix: Ssortingng)(f: (S3ObjectSummary) => T) = { def scan(acc:List[T], listing:ObjectListing): List[T] = { val summaries = asScala[S3ObjectSummary](listing.getObjectSummaries()) val mapped = (for (summary <- summaries) yield f(summary)).toList if (!listing.isTruncated) mapped.toList else scan(acc ::: mapped, s3.listNextBatchOfObjects(listing)) } scan(List(), s3.listObjects(bucket, prefix)) }
Pour appeler la fonction curry map()
ci-dessus, il suffit de passer l'object AmazonS3Client déjà construit (et correctement initialisé) (reportez-vous à la référence officielle de l' API AWS SDK pour Java ), le nom du compartiment et le nom du préfixe dans la première liste de parameters. Passez également la fonction f()
vous souhaitez appliquer pour mapper chaque résumé d'object dans la deuxième liste de parameters.
Par exemple
val keyOwnerTuples = map(s3, bucket, prefix)(s => (s.getKey, s.getOwner))
renverra la liste complète des tuples (key, owner)
dans ce compartiment / préfixe
ou
map(s3, "bucket", "prefix")(s => println(s))
comme vous le feriez normalement avec Monads dans la functional programming
Après zach, je recommanderais également boto , mais je devais faire une légère différence avec son code:
conn = boto.connect_s3('access-key', 'secret'key') bucket = conn.lookup('bucket-name') for key in bucket: print key.name
Mise à jour 20-12-2016:
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 éléments contenus dans un compartiment AWS S3:
aws s3 ls bucket-name
Cette commande place une liste de tous les éléments dans un compartiment AWS S3 … dans un fichier texte de votre répertoire actuel:
aws s3 ls bucket-name | cat >> file-name.txt
aws s3api list-objects --bucket bucket-name
Pour plus de détails, voir ici – http://docs.aws.amazon.com/cli/latest/reference/s3api/list-objects.html
Code en python en utilisant la géniale “boto” lib . 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( , ) try: bucket = conn.get_bucket( , validate = True ) except boto.exception.S3ResponseError, e: do_something() # The bucket does not exist, choose how to deal with it or raise the exception return [ key.name.encode( "utf-8" ) for key in bucket.list() ]
N’oubliez pas de remplacer les
La commande ci-dessous permet d’obtenir tous les noms de fichiers de votre compartiment AWS S3 et d’écrire dans un fichier texte de votre répertoire actuel:
aws s3 ls s3://Bucketdirectory/Subdirectory/ | cat >> FileNames.txt
Il y a deux façons de s’y prendre. Utiliser Python
sesssion = boto3.Session(aws_access_key_id, aws_secret_access_key) s3 = sesssion.resource('s3') bucketName = 'testbucket133' bucket = s3.Bucket(bucketName) for obj in bucket.objects.all(): print(obj.key)
Une autre façon d’utiliser AWS cli pour cela
aws s3 ls s3://{bucketname} example : aws s3 ls s3://testbucket133
En Java, vous pouvez obtenir les clés en utilisant ListObjects (voir la documentation AWS )
FileWriter fileWriter; BufferedWriter bufferedWriter; // [...] AmazonS3 s3client = new AmazonS3Client(new ProfileCredentialsProvider()); ListObjectsRequest listObjectsRequest = new ListObjectsRequest() .withBucketName(bucketName) .withPrefix("myprefix"); ObjectListing objectListing; do { objectListing = s3client.listObjects(listObjectsRequest); for (S3ObjectSummary objectSummary : objectListing.getObjectSummaries()) { // write to file with eg a bufferedWriter bufferedWriter.write(objectSummary.getKey()); } listObjectsRequest.setMarker(objectListing.getNextMarker()); } while (objectListing.isTruncated());
Vous pouvez utiliser l’api s3 standard –
aws s3 ls s3://root/folder1/folder2/
function showUploads(){ if (!class_exists('S3')) require_once 'S3.php'; // AWS access info if (!defined('awsAccessKey')) define('awsAccessKey', '234567665464tg'); if (!defined('awsSecretKey')) define('awsSecretKey', 'dfshgfhfghdgfhrt463457'); $bucketName = 'my_bucket1234'; $s3 = new S3(awsAccessKey, awsSecretKey); $contents = $s3->getBucket($bucketName); echo "
List of Files in bucket : {$bucketName}
"; $n = 1; foreach ($contents as $p => $v): echo $p."
"; $n++; endforeach; }
Sinon, vous pouvez 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 répertorier le contenu.
$ mc ls s3 / kline / [2016-04-30 13:20:47 IST] 1.1MiB 1.jpg [2016-04-30 16:03:55 IST] 7.5Ki docker.png [2016-04-30 15:16:17 IST] 50KiB pi.png [2016-05-10 14:34:39 IST] 365KiB upton.pdf
Remarque:
Installation de Minio Client Linux Download mc pour:
$ chmod 755 mc $ ./mc --help
Configuration des informations d’identification AWS avec Minio Client
$ mc config host append mys3 https://s3.amazonaws.com BKIKJAA5BMMU2RHO6IBB V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12
Note: Veuillez remplacer mys3 par un alias que vous souhaitez pour ce compte et, BKIKJAA5BMMU2RHO6IBB, V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12 avec votre clé d’access AWS ACCESS et votre clé SECRET
J’espère que cela aide.
Disclaimer: Je travaille pour Minio
Vous pouvez lister tous les fichiers dans le compartiment aws s3 en utilisant la commande
aws s3 ls path/to/file
et pour le sauvegarder dans un fichier, utilisez
aws s3 ls path/to/file >> save_result.txt
si vous souhaitez append votre résultat dans un fichier, sinon:
aws s3 ls path/to/file > save_result.txt
si vous voulez effacer ce qui a été écrit auparavant.
Cela fonctionnera à la fois dans Windows et Linux.
# find like file listing for s3 files aws s3api --profile <> \ --endpoint-url=<> list-objects \ --bucket <> --query 'Contents[].{Key: Key}'
En javascript, vous pouvez utiliser
s3.listObjects (params, fonction (err, result) {});
pour obtenir tous les objects à l’intérieur du seau. vous devez passer le nom du compartiment à l’ intérieur de params (Bucket: name) .
Version simplifiée et mise à jour de la réponse Scala par Paolo:
import scala.collection.JavaConversions.{collectionAsScalaIterable => asScala} import com.amazonaws.services.s3.AmazonS3 import com.amazonaws.services.s3.model.{ListObjectsRequest, ObjectListing, S3ObjectSummary} def buildListing(s3: AmazonS3, request: ListObjectsRequest): List[S3ObjectSummary] = { def buildList(listIn: List[S3ObjectSummary], bucketList:ObjectListing): List[S3ObjectSummary] = { val latestList: List[S3ObjectSummary] = bucketList.getObjectSummaries.toList if (!bucketList.isTruncated) listIn ::: latestList else buildList(listIn ::: latestList, s3.listNextBatchOfObjects(bucketList)) } buildList(List(), s3.listObjects(request)) }
Retirer les génériques et utiliser le ListObjectRequest généré par les générateurs du SDK.
public static Dictionary ListBucketsByCreationDate(ssortingng AccessKey, ssortingng SecretKey) { return AWSClientFactory.CreateAmazonS3Client(AccessKey, SecretKey).ListBuckets().Buckets.ToDictionary(s3Bucket => s3Bucket.BucketName, s3Bucket => DateTime.Parse(s3Bucket.CreationDate)); }
En PHP, vous pouvez obtenir la liste complète des objects AWS-S3 dans un compartiment spécifique en utilisant l’appel suivant
$S3 = \Aws\S3\S3Client::factory(array('region' => $region,)); $iterator = $S3->getIterator('ListObjects', array('Bucket' => $bucket)); foreach ($iterator as $obj) { echo $obj['Key']; }
Vous pouvez redirect la sortie du code ci-dessus dans un fichier pour obtenir la liste des clés.
La façon la plus simple d’obtenir un fichier texte très utilisable consiste à télécharger le navigateur S3 http://s3browser.com/ et à utiliser le générateur d’URL Web pour générer une liste de chemins de liens complets. C’est très pratique et implique environ 3 clics.
-Browse to Folder -Select All -Generate Urls
Bonne chance à vous.