Ich habe einen Amazon S3-Bucket mit Zehntausenden von Dateinamen. Was ist der einfachste Weg, um eine Textdatei zu erhalten, in der alle Dateinamen im Bucket aufgelistet sind?
Ich habe einen Amazon S3-Bucket mit Zehntausenden von Dateinamen. Was ist der einfachste Weg, um eine Textdatei zu erhalten, in der alle Dateinamen im Bucket aufgelistet sind?
Antworten:
Ich würde empfehlen, Boto zu verwenden . Dann sind es ein paar kurze Zeilen 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')
Speichern Sie dies als list.py, öffnen Sie ein Terminal und führen Sie dann Folgendes aus:
$ python list.py > results.txt
Dokumentation für aws s3 ls
AWS hat kürzlich seine Befehlszeilentools veröffentlicht. Dies funktioniert ähnlich wie Boto und kann mit sudo easy_install awscli
oder installiert werdensudo pip install awscli
Sobald Sie installiert haben, können Sie einfach ausführen
aws s3 ls
Welches zeigt Ihnen alle Ihre verfügbaren Eimer
CreationTime Bucket
------------ ------
2013-07-11 17:08:50 mybucket
2013-07-24 14:55:44 mybucket2
Sie können dann einen bestimmten Bucket nach Dateien abfragen.
Befehl :
aws s3 ls s3://mybucket
Ausgabe :
Bucket: mybucket
Prefix:
LastWriteTime Length Name
------------- ------ ----
PRE somePrefix/
2013-07-25 17:06:27 88 test.txt
Dies zeigt Ihnen alle Ihre Dateien.
--recursive
Flag hinzu, um alle Objekte unter dem angegebenen Verzeichnis zu sehen
s3cmd ist für solche Dinge von unschätzbarem Wert
$ s3cmd ls -r s3://yourbucket/ | awk '{print $4}' > objects_in_bucket
s3cmd
Gibt die nach Datum sortierten Dateinamen zurück. Gibt es eine Möglichkeit, die Rückgabe nur der Dateien zu veranlassen, die danach hinzugefügt wurden 2015-10-23 20:46
?
Seien Sie vorsichtig, Amazon List gibt nur 1000 Dateien zurück. Wenn Sie alle Dateien durchlaufen möchten, müssen Sie die Ergebnisse mithilfe von Markierungen paginieren:
In Rubin mit 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
Ende
Hoffe das hilft, Vincent
Update 15-02-2019:
Mit diesem Befehl erhalten Sie eine Liste aller Buckets in AWS S3:
aws s3 ls
Mit diesem Befehl erhalten Sie eine Liste aller Objekte der obersten Ebene in einem AWS S3-Bucket:
aws s3 ls bucket-name
Mit diesem Befehl erhalten Sie eine Liste ALLER Objekte in einem AWS S3-Bucket:
aws s3 ls bucket-name --recursive
Dieser Befehl platziert eine Liste von ALLEN in einem AWS S3-Bucket ... in einer Textdatei in Ihrem aktuellen Verzeichnis:
aws s3 ls bucket-name --recursive | cat >> file-name.txt
Für Scala-Entwickler ist es hier eine rekursive Funktion, a auszuführen vollständigen Scan und den Inhalt eines AmazonS3-Buckets mithilfe des offiziellen AWS SDK für Java zuzuordnen
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))
}
Um die oben genannte Curry- map()
Funktion aufzurufen , übergeben Sie einfach das bereits erstellte (und ordnungsgemäß initialisierte) AmazonS3Client-Objekt (siehe offizielle AWS SDK für Java-API-Referenz ), den Bucket-Namen und den Präfixnamen in der ersten Parameterliste. Übergeben Sie auch die Funktion, die f()
Sie anwenden möchten, um jede Objektzusammenfassung in der zweiten Parameterliste zuzuordnen.
Beispielsweise
val keyOwnerTuples = map(s3, bucket, prefix)(s => (s.getKey, s.getOwner))
gibt die vollständige Liste der (key, owner)
Tupel in diesem Bucket / Präfix zurück
oder
map(s3, "bucket", "prefix")(s => println(s))
wie Sie es normalerweise von Monaden in der funktionalen Programmierung tun würden
mapped.toList
ohne die vorherige zurückgegebenacc
Es gibt verschiedene Möglichkeiten, wie Sie vorgehen können. Python verwenden
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)
Eine andere Möglichkeit ist die Verwendung von AWS cli
aws s3 ls s3://{bucketname}
example : aws s3 ls s3://testbucket133
s3 = boto3.resource('s3')
session
Methode nicht verwenden. AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID']
AWS_SECRET_ACCESS_KEY = os.environ['AWS_SECRET_ACCESS_KEY']
Nach zach würde ich auch boto empfehlen , aber ich musste einen kleinen Unterschied zu seinem Code machen:
conn = boto.connect_s3('access-key', 'secret'key')
bucket = conn.lookup('bucket-name')
for key in bucket:
print key.name
conn.lookup
kehrt zurück, None
anstatt einen S3ResponseError(NoSuchBucket)
Fehler zu werfen
aws s3api list-objects --bucket bucket-name
Weitere Informationen finden Sie hier - http://docs.aws.amazon.com/cli/latest/reference/s3api/list-objects.html
aws s3api list-objects --bucket <bucket-name>
Zunächst stellen Sie sicher , Sie sind auf ein instance terminal
und Sie haben all access
von S3
in den IAM
Sie verwenden. Zum Beispiel habe ich eine ec2-Instanz verwendet.
pip3 install awscli
Dann konfigurieren Sie aws
aws configure
Dann füllen Sie outcredantials aus: -
$ 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)
Jetzt sehen Sie alle Eimer
aws s3 ls
Speichern Sie alle Eimernamen
aws s3 ls > output.txt
Alle Dateistrukturen in einem Bucket anzeigen
aws s3 ls bucket-name --recursive
Speichern Sie die Dateistruktur in jedem Bucket
aws s3 ls bucket-name --recursive > file_Structure.txt
Hoffe das hilft.
Mit AWS CLI können Sie alle Dateien eines S3-Buckets schnell anzeigen und auch andere Vorgänge ausführen.
Führen Sie die folgenden Schritte aus, um AWS CLI zu verwenden:
Verwenden Sie den Befehl, um alle Dateien eines S3-Buckets anzuzeigen
aws s3 ls s3: // your_bucket_name --recursive
Verweis auf die Verwendung von AWS cli für verschiedene AWS-Services: https://docs.aws.amazon.com/cli/latest/reference/
In Java können Sie die Schlüssel mit ListObjects abrufen (siehe AWS-Dokumentation ).
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 in Python mit der fantastischen "boto" lib . Der Code gibt eine Liste der Dateien in einem Bucket zurück und behandelt auch Ausnahmen für fehlende Buckets.
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() ]
Vergessen Sie nicht, die <PLACE_HOLDERS> durch Ihre Werte zu ersetzen.
Mit dem folgenden Befehl werden alle Dateinamen aus Ihrem AWS S3-Bucket abgerufen und in eine Textdatei in Ihrem aktuellen Verzeichnis geschrieben:
aws s3 ls s3://Bucketdirectory/Subdirectory/ | cat >> FileNames.txt
Alternativ können Sie Minio Client aka mc verwenden. Es ist Open Source und kompatibel mit AWS S3. Es ist für Linux, Windows, Mac, FreeBSD verfügbar .
Sie müssen lediglich den Befehl mc ls ausführen, um den Inhalt aufzulisten.
$ mc ls s3 / kline / [2016-04-30 13:20:47 IST] 1.1MiB 1.jpg [2016-04-30 16:03:55 IST] 7.5KiB docker.png [2016-04-30 15:16:17 IST] 50KiB pi.png [2016-05-10 14:34:39 IST] 365KiB upton.pdf
Hinweis:
Installieren von Minio Client Linux Laden Sie mc herunter für:
$ chmod 755 mc $ ./mc --help
Einrichten von AWS-Anmeldeinformationen mit Minio Client
$ mc config host add mys3 https://s3.amazonaws.com BKIKJAA5BMMU2RHO6IBB V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12
Hinweis: Bitte ersetzen Sie mys3 durch den Alias, den Sie für dieses Konto wünschen, und BKIKJAA5BMMU2RHO6IBB, V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12 durch Ihren AWS ACCESS-KEY und SECRET-KEY
Ich hoffe es hilft.
Haftungsausschluss: Ich arbeite für Minio
Mit dem Befehl können Sie alle Dateien im aws s3-Bucket auflisten
aws s3 ls path/to/file
und um es in einer Datei zu speichern, verwenden Sie
aws s3 ls path/to/file >> save_result.txt
Wenn Sie Ihr Ergebnis andernfalls an eine Datei anhängen möchten:
aws s3 ls path/to/file > save_result.txt
wenn Sie löschen möchten, was zuvor geschrieben wurde.
Es funktioniert sowohl unter Windows als auch unter Linux.
In Javascript können Sie verwenden
s3.listObjects (params, function (err, result) {});
um alle Objekte in den Eimer zu bekommen. Sie müssen den Bucket-Namen in den Parametern übergeben (Bucket: Name) .
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}'
Vereinfachte und aktualisierte Version der Scala-Antwort von 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))
}
Entfernen Sie die Generika und verwenden Sie die von den SDK-Buildern generierte ListObjectRequest.
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));
}
In PHP können Sie mithilfe des folgenden Aufrufs eine vollständige Liste der AWS-S3-Objekte in einem bestimmten Bucket abrufen
$S3 = \Aws\S3\S3Client::factory(array('region' => $region,));
$iterator = $S3->getIterator('ListObjects', array('Bucket' => $bucket));
foreach ($iterator as $obj) {
echo $obj['Key'];
}
Sie können die Ausgabe des obigen Codes in eine Datei umleiten, um eine Liste der Schlüssel zu erhalten.
Verwenden Sie Plumbum, um die CLI zu verpacken, und Sie erhalten eine klare Syntax:
import plumbum as pb
folders = pb.local['aws']('s3', 'ls')
Bitte versuchen Sie dieses Bash-Skript. Es verwendet den Befehl curl, ohne dass externe Abhängigkeiten erforderlich sind
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}"
Der EINFACHSTE Weg, um eine sehr benutzerfreundliche Textdatei zu erhalten, besteht darin, den S3-Browser http://s3browser.com/ herunterzuladen und mit dem Web-URL-Generator eine Liste der vollständigen Linkpfade zu erstellen. Es ist sehr praktisch und erfordert ca. 3 Klicks.
-Browse to Folder
-Select All
-Generate Urls
Viel Glück für Sie.
boto.s3.bucketlistresultset.BucketListResultSet
wird die in der Frage erwähnte Bedingung "Zehntausende von Dateinamen" angesprochen.