J'ai un compartiment Amazon s3 contenant des dizaines de milliers de noms de fichiers. Quel est le moyen le plus simple d'obtenir un fichier texte répertoriant tous les noms de fichiers du compartiment?
Je recommanderais d'utiliser boto . Alors 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 ceci sous list.py, ouvrez un terminal, puis exécutez:
$ python list.py > results.txt
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 va vous montrer 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.
s3cmd est inestimable pour ce genre de chose
$ s3cmd ls -r s3://yourbucket/ | awk '{print $4}' > objects_in_bucket
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 Ruby 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 ça aide, vincent
Pour les développeurs Scala, il s'agit ici d'une fonction récursive permettant d'exécuter un analyse complète et mappage le contenu d'un compartiment AmazonS3 à l'aide du 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: String, prefix: String)(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 curried map()
ci-dessus, transmettez simplement l'objet AmazonS3Client déjà construit (et correctement initialisé) (voir le Référence de l'API AWS SDK pour Java ) officiel, le nom du compartiment et le nom du préfixe dans la première liste de paramètres. Passez également la fonction f()
que 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 tuples (key, owner)
dans ce compartiment/préfixe
ou
map(s3, "bucket", "prefix")(s => println(s))
comme vous le feriez normalement par Monades dans la programmation fonctionnelle
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 ALL dans un compartiment AWS S3 ... dans un fichier texte de votre répertoire actuel:
aws s3 ls bucket-name --recursive | cat >> file-name.txt
Après zach, je recommanderais également boto , mais je devais apporter une petite différence à son code:
conn = boto.connect_s3('access-key', 'secret'key')
bucket = conn.lookup('bucket-name')
for key in bucket:
print key.name
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
Il y a deux façons de s'y prendre. Utiliser Python
import boto3
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 méthode consiste à utiliser AWS cli pour cela
aws s3 ls s3://{bucketname}
example : aws s3 ls s3://testbucket133
En Java, vous pouvez obtenir les clés à l'aide de ListObjects (voir 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 e.g. a bufferedWriter
bufferedWriter.write(objectSummary.getKey());
}
listObjectsRequest.setMarker(objectListing.getNextMarker());
} while (objectListing.isTruncated());
Code en python utilisant le génial "boto" lib . Le code retourne 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 exception
return [ key.name.encode( "utf-8" ) for key in bucket.list() ]
N'oubliez pas de remplacer le <PLACE_HOLDERS> par vos valeurs.
La commande ci-dessous récupère tous les noms de fichiers de votre compartiment AWS S3 et les écrit dans un fichier texte de votre répertoire actuel:
aws s3 ls s3://Bucketdirectory/Subdirectory/ | cat >> FileNames.txt
Pour boto3 de Python après avoir utilisé aws configure
:
import boto3
s3 = boto3.resource('s3')
bucket = s3.Bucket('name')
for obj in bucket.objects.all():
print(obj.key)
Vous pouvez utiliser l’application 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 "<hr/>List of Files in bucket : {$bucketName} <hr/>";
$n = 1;
foreach ($contents as $p => $v):
echo $p."<br/>";
$n++;
endforeach;
}
Version simplifiée et mise à jour de la réponse Scala de 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))
}
Suppression des génériques et utilisation de ListObjectRequest généré par les générateurs du SDK.
Sinon, vous pouvez utiliser Minio Client aka mc. Son source ouverte 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 HIST] 1.1MiB 1.jpg [2016-04-30 16:03:55 HIST] 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 Téléchargez mc pour:
$ chmod 755 mc $ ./mc --help
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 souhaité pour ce compte et par BKIKJAA5BMMU2RHO6IBB, V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12 avec votre clé d'accès AWS et vos clés SECRET
J'espère que ça aide.
Disclaimer: Je travaille pour Minio
AWS CLI peut vous permettre de voir rapidement tous les fichiers d'un compartiment S3 et vous aider à effectuer d'autres opérations.
Pour utiliser AWS CLI, suivez les étapes ci-dessous:
Pour voir tous les fichiers d'un compartiment S3, utilisez la commande
aws s3 ls s3: // your_bucket_name --recursive
Référence à utiliser AWS cli pour différents services AWS: https://docs.aws.Amazon.com/cli/latest/reference/
public static Dictionary<string, DateTime> ListBucketsByCreationDate(string AccessKey, string SecretKey)
{
return AWSClientFactory.CreateAmazonS3Client(AccessKey,
SecretKey).ListBuckets().Buckets.ToDictionary(s3Bucket => s3Bucket.BucketName,
s3Bucket => DateTime.Parse(s3Bucket.CreationDate));
}
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 voulez ajouter 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 sous Windows et sous Linux.
Dans PHP, vous pouvez obtenir la liste complète des objets AWS-S3 dans un compartiment spécifique à l'aide de 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 rediriger la sortie du code ci-dessus dans un fichier pour obtenir la liste des clés.
# find like file listing for s3 files
aws s3api --profile <<profile-name>> \
--endpoint-url=<<end-point-url>> list-objects \
--bucket <<bucket-name>> --query 'Contents[].{Key: Key}'
Utilisez plumbum pour envelopper le cli et vous aurez une syntaxe claire:
import plumbum as pb
folders = pb.local['aws']('s3', 'ls')
En javascript, vous pouvez utiliser
s3.listObjects (params, fonction (err, résultat) {});
obtenir tous les objets dans le seau. vous devez passer le nom du compartiment dans params (Bucket: name) .