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?
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?
Réponses:
Je recommanderais d'utiliser boto . Ensuite, c'est quelques lignes rapides 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-le 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 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
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.
--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
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ès 2015-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
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
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
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
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 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
ou
map(s3, "bucket", "prefix")(s => println(s))
comme vous le feriez normalement avec les Monades dans la programmation fonctionnelle
mapped.toList
sans aucun des précédentsacc
Il y a plusieurs façons de procéder. 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 façon consiste à utiliser AWS cli pour cela
aws s3 ls s3://{bucketname}
example : aws s3 ls s3://testbucket133
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:
conn = boto.connect_s3('access-key', 'secret'key')
bucket = conn.lookup('bucket-name')
for key in bucket:
print key.name
conn.lookup
renvoie None
au lieu de lancer une S3ResponseError(NoSuchBucket)
erreur
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
aws s3api list-objects --bucket <bucket-name>
D' abord , assurez - vous que vous êtes sur un instance terminal
et vous avez all access
de S3
en IAM
vous 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
J'espère que cela t'aides.
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/
En Java, vous pouvez obtenir les clés à l'aide de 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 e.g. a bufferedWriter
bufferedWriter.write(objectSummary.getKey());
}
listObjectsRequest.setMarker(objectListing.getNextMarker());
} while (objectListing.isTruncated());
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 exception
return [ key.name.encode( "utf-8" ) for key in bucket.list() ]
N'oubliez pas de remplacer <PLACE_HOLDERS> par vos valeurs.
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:
aws s3 ls s3://Bucketdirectory/Subdirectory/ | cat >> FileNames.txt
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.
$ mc ls s3 / kline / [2016-04-30 13:20:47 IST] 1.1MiB 1.jpg [2016-04-30 16:03:55 IST] 7,5 Ko docker.png [2016-04-30 15:16:17 IST] 50 Ko 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 - aide
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
Vous pouvez lister tous les fichiers, dans le bucket aws s3 en utilisant la commande
aws s3 ls path/to/file
et pour l'enregistrer dans un fichier, utilisez
aws s3 ls path/to/file >> save_result.txt
si vous souhaitez 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 Linux.
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) .
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;
}
# 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}'
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 du ListObjectRequest généré par les générateurs du SDK.
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));
}
En 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.
Utilisez plumbum pour envelopper le cli et vous aurez une syntaxe claire:
import plumbum as pb
folders = pb.local['aws']('s3', 'ls')
veuillez essayer ce script bash. il utilise la commande curl sans avoir besoin de dépendances externes
bucket=<bucket_name>
region=<region_name>
awsAccess=<access_key>
awsSecret=<secret_key>
awsRegion="${region}"
baseUrl="s3.${awsRegion}.amazonaws.com"
m_sed() {
if which gsed > /dev/null 2>&1; then
gsed "$@"
else
sed "$@"
fi
}
awsStringSign4() {
kSecret="AWS4$1"
kDate=$(printf '%s' "$2" | openssl dgst -sha256 -hex -mac HMAC -macopt "key:${kSecret}" 2>/dev/null | m_sed 's/^.* //')
kRegion=$(printf '%s' "$3" | openssl dgst -sha256 -hex -mac HMAC -macopt "hexkey:${kDate}" 2>/dev/null | m_sed 's/^.* //')
kService=$(printf '%s' "$4" | openssl dgst -sha256 -hex -mac HMAC -macopt "hexkey:${kRegion}" 2>/dev/null | m_sed 's/^.* //')
kSigning=$(printf 'aws4_request' | openssl dgst -sha256 -hex -mac HMAC -macopt "hexkey:${kService}" 2>/dev/null | m_sed 's/^.* //')
signedString=$(printf '%s' "$5" | openssl dgst -sha256 -hex -mac HMAC -macopt "hexkey:${kSigning}" 2>/dev/null | m_sed 's/^.* //')
printf '%s' "${signedString}"
}
if [ -z "${region}" ]; then
region="${awsRegion}"
fi
# Initialize helper variables
authType='AWS4-HMAC-SHA256'
service="s3"
dateValueS=$(date -u +'%Y%m%d')
dateValueL=$(date -u +'%Y%m%dT%H%M%SZ')
# 0. Hash the file to be uploaded
# 1. Create canonical request
# NOTE: order significant in ${signedHeaders} and ${canonicalRequest}
signedHeaders='host;x-amz-content-sha256;x-amz-date'
canonicalRequest="\
GET
/
host:${bucket}.s3.amazonaws.com
x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
x-amz-date:${dateValueL}
${signedHeaders}
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
# Hash it
canonicalRequestHash=$(printf '%s' "${canonicalRequest}" | openssl dgst -sha256 -hex 2>/dev/null | m_sed 's/^.* //')
# 2. Create string to sign
stringToSign="\
${authType}
${dateValueL}
${dateValueS}/${region}/${service}/aws4_request
${canonicalRequestHash}"
# 3. Sign the string
signature=$(awsStringSign4 "${awsSecret}" "${dateValueS}" "${region}" "${service}" "${stringToSign}")
# Upload
curl -g -k "https://${baseUrl}/${bucket}" \
-H "x-amz-content-sha256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" \
-H "x-amz-Date: ${dateValueL}" \
-H "Authorization: ${authType} Credential=${awsAccess}/${dateValueS}/${region}/${service}/aws4_request,SignedHeaders=${signedHeaders},Signature=${signature}"
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.
-Browse to Folder
-Select All
-Generate Urls
Bonne chance à vous.
boto.s3.bucketlistresultset.BucketListResultSet
aborde la condition des «dizaines de milliers de noms de fichiers» mentionnée dans la question.