web-dev-qa-db-fra.com

Moyen rapide de répertorier tous les fichiers dans le compartiment Amazon S3?

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?

112
Steve

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
109
Zachary Ozer

AWS CLI

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. 

43
Layke

s3cmd est inestimable pour ce genre de chose

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

41
mat kelcey

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

32
vdaubry

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

12
Paolo Angioletti

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

9
Khalil Gharbaoui

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
7
Datageek
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

6
sysuser

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
3
Mahesh Mogal

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());
2
H6.

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.

2
Oran

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
2

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)
1
André

Vous pouvez utiliser l’application s3 standard - 

aws s3 ls s3://root/folder1/folder2/
1
Nrj
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;
}
1
Sandeep Penmetsa

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.

0
wildgooze

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: 

  • s3: alias pour Amazon S3 
  • kline: nom du compartiment AWS S3

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

0
koolhead17

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:

  1. Installer AWS CLI.
  2. Configurez AWS CLI pour utiliser les informations d'identification de sécurité par défaut et la région AWS par défaut.
  3. 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/

0
singh30
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));

}
0
user1172192

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.

0
Aklank Jain

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.

0
Shriganesh Shintre
# 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}'
0
Yordan Georgiev

Utilisez plumbum pour envelopper le cli et vous aurez une syntaxe claire:

import plumbum as pb
folders = pb.local['aws']('s3', 'ls')
0
JaviOverflow

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) .

0