Schnelle Möglichkeit, alle Dateien im Amazon S3-Bucket aufzulisten?
151
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?
Wie in jlduponts Kommentar zur Antwort von vdaubry angedeutet, boto.s3.bucketlistresultset.BucketListResultSetwird die in der Frage erwähnte Bedingung "Zehntausende von Dateinamen" angesprochen.
chb
1
Beachten Sie, dass für Buckets mit einer sehr großen Anzahl von Objekten, z. B. Millionen oder Milliarden, die folgenden Codierungs- / Skriptansätze nicht gut funktionieren. Sie sollten stattdessen S3 Inventory aktivieren und einen Inventarbericht abrufen.
Wenn Sie Folgendes erhalten: boto.exception.S3ResponseError: S3ResponseError: 403 Verboten Stellen Sie sicher, dass die Benutzerrichtlinie für den Zugriffs- / geheimen Schlüssel Zugriff auf den S3 hat.
AWS hat kürzlich seine Befehlszeilentools veröffentlicht. Dies funktioniert ähnlich wie Boto und kann mit sudo easy_install awsclioder installiert werdensudo pip install awscli
Sobald Sie installiert haben, können Sie einfach ausführen
s3cmdGibt 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?
SexyBeast
Beachten Sie, dass wenn die Dateinamen Leerzeichen haben, dies einen kleinen Fehler hat, aber ich nicht das awk-foo habe, um es zu beheben
Colin D
36
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:
Das funktioniert, ist aber nicht wirklich das, was ich brauche. Es werden nur alle Präfixe der "obersten Ebene" aufgelistet. Gibt es eine Möglichkeit, alle Objekte in einen Bucket, Präfixe und alles zu bekommen?
@rinogo Es passt vielleicht nicht zu deinen Bedürfnissen ... aber es funktioniert und das ist es, was hier zählt. Es passt zu den Bedürfnissen anderer Leute als richtige Antwort.
Khalil Gharbaoui
Wie ich schon sagte, es funktioniert - danke! Aber es beantwortet nicht die Frage von OP. OP fragte nach einer Möglichkeit, "alle Dateinamen im Bucket [aufzulisten]". Hier werden nur Objekte der obersten Ebene aufgelistet, nicht alle Objekte.
Rinogo
2
Aha, aber das ist nicht schwer zu tun. Fügen Sie dem Befehl einfach '--recursive' hinzu. Ich werde es meiner Antwort hinzufügen, danke für den Hinweis
Khalil Gharbaoui
12
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
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
Es gibt einen Fehler mit diesem Code. Wenn der erste Scan abgeschnitten ist, wird die endgültige Rückgabe nur mapped.toListohne die vorherige zurückgegebenacc
Mark Wang
Vielen Dank - beachten Sie, dass AmazonS3Client jetzt nur noch AmazonS3 sein sollte.
Anthony Holland
11
Es gibt verschiedene Möglichkeiten, wie Sie vorgehen können. Python verwenden
Wenn aws bereits konfiguriert ist, kann man die Zeilen 2 und 3 durchs3 = boto3.resource('s3')
sinapan
Wenn Sie die Umgebungsvariablen platziert haben, müssen Sie die Variablen in der sessionMethode nicht verwenden. AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID']AWS_SECRET_ACCESS_KEY = os.environ['AWS_SECRET_ACCESS_KEY']
Flavio
7
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
Zunächst stellen Sie sicher , Sie sind auf ein instance terminalund Sie haben all accessvon S3in den IAMSie 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
Es gibt eine weitere einfache API, die den Bucket-Namen verwendet und die darin vorhandenen Objekte auflistet. ObjectListing Objects = s3client.listObjects (BucketName) Der Javadoc-Link ist unten angegeben, docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/…
Rajesh
2
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 exceptionreturn[ key.name.encode("utf-8")for key in bucket.list()]
Vergessen Sie nicht, die <PLACE_HOLDERS> durch Ihre Werte zu ersetzen.
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
Vielen Dank für dieses Code-Snippet, das möglicherweise nur begrenzte, sofortige Hilfe bietet. Eine richtige Erklärung würde ihren langfristigen Wert erheblich verbessern, indem sie zeigt, warum dies eine gute Lösung für das Problem ist, und es für zukünftige Leser mit anderen, ähnlichen Fragen nützlicher machen. Bitte bearbeiten Sie Ihre Antwort, um eine Erklärung hinzuzufügen, einschließlich der von Ihnen getroffenen Annahmen.
Toby Speight
0
Vereinfachte und aktualisierte Version der Scala-Antwort von Paolo:
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.
boto.s3.bucketlistresultset.BucketListResultSet
wird die in der Frage erwähnte Bedingung "Zehntausende von Dateinamen" angesprochen.Antworten:
Ich würde empfehlen, Boto zu verwenden . Dann sind es ein paar kurze Zeilen Python :
Speichern Sie dies als list.py, öffnen Sie ein Terminal und führen Sie dann Folgendes aus:
quelle
AWS CLI
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
Welches zeigt Ihnen alle Ihre verfügbaren Eimer
Sie können dann einen bestimmten Bucket nach Dateien abfragen.
Befehl :
Ausgabe :
Dies zeigt Ihnen alle Ihre Dateien.
quelle
--recursive
Flag hinzu, um alle Objekte unter dem angegebenen Verzeichnis zu sehens3cmd ist für solche Dinge von unschätzbarem Wert
$ s3cmd ls -r s3://yourbucket/ | awk '{print $4}' > objects_in_bucket
quelle
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 wurden2015-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
Ende
Hoffe das hilft, Vincent
quelle
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
quelle
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
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, dief()
Sie anwenden möchten, um jede Objektzusammenfassung in der zweiten Parameterliste zuzuordnen.Beispielsweise
gibt die vollständige Liste der
(key, owner)
Tupel in diesem Bucket / Präfix zurückoder
wie Sie es normalerweise von Monaden in der funktionalen Programmierung tun würden
quelle
mapped.toList
ohne die vorherige zurückgegebenacc
Es gibt verschiedene Möglichkeiten, wie Sie vorgehen können. Python verwenden
Eine andere Möglichkeit ist die Verwendung von AWS cli
quelle
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:
quelle
conn.lookup
kehrt zurück,None
anstatt einenS3ResponseError(NoSuchBucket)
Fehler zu werfenWeitere Informationen finden Sie hier - http://docs.aws.amazon.com/cli/latest/reference/s3api/list-objects.html
quelle
aws s3api list-objects --bucket <bucket-name>
Für Pythons boto3 nach der Verwendung
aws configure
:quelle
Zunächst stellen Sie sicher , Sie sind auf ein
instance terminal
und Sie habenall access
vonS3
in denIAM
Sie verwenden. Zum Beispiel habe ich eine ec2-Instanz verwendet.Dann konfigurieren Sie aws
Dann füllen Sie outcredantials aus: -
Jetzt sehen Sie alle Eimer
Speichern Sie alle Eimernamen
Alle Dateistrukturen in einem Bucket anzeigen
Speichern Sie die Dateistruktur in jedem Bucket
Hoffe das hilft.
quelle
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/
quelle
In Java können Sie die Schlüssel mit ListObjects abrufen (siehe AWS-Dokumentation ).
quelle
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.
Vergessen Sie nicht, die <PLACE_HOLDERS> durch Ihre Werte zu ersetzen.
quelle
Mit dem folgenden Befehl werden alle Dateinamen aus Ihrem AWS S3-Bucket abgerufen und in eine Textdatei in Ihrem aktuellen Verzeichnis geschrieben:
quelle
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.
Hinweis:
Installieren von Minio Client Linux Laden Sie mc herunter für:
Einrichten von AWS-Anmeldeinformationen mit Minio Client
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
quelle
Sie können Standard s3 API verwenden -
quelle
Mit dem Befehl können Sie alle Dateien im aws s3-Bucket auflisten
und um es in einer Datei zu speichern, verwenden Sie
Wenn Sie Ihr Ergebnis andernfalls an eine Datei anhängen möchten:
wenn Sie löschen möchten, was zuvor geschrieben wurde.
Es funktioniert sowohl unter Windows als auch unter Linux.
quelle
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) .
quelle
quelle
quelle
Vereinfachte und aktualisierte Version der Scala-Antwort von Paolo:
Entfernen Sie die Generika und verwenden Sie die von den SDK-Buildern generierte ListObjectRequest.
quelle
quelle
In PHP können Sie mithilfe des folgenden Aufrufs eine vollständige Liste der AWS-S3-Objekte in einem bestimmten Bucket abrufen
Sie können die Ausgabe des obigen Codes in eine Datei umleiten, um eine Liste der Schlüssel zu erhalten.
quelle
Verwenden Sie Plumbum, um die CLI zu verpacken, und Sie erhalten eine klare Syntax:
quelle
Bitte versuchen Sie dieses Bash-Skript. Es verwendet den Befehl curl, ohne dass externe Abhängigkeiten erforderlich sind
quelle
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.
Viel Glück für Sie.
quelle