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

Antworten:


120

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

3
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.
Topherjaynes

1
Ich habe 403 Fehler erhalten, und ich musste diese Anweisungen befolgen, damit es funktioniert: stackoverflow.com/a/22462419/1143558
Ljubisa Livac

Wie durchläuft man es in Bash?
SuperUberDuper

4
Könnten Sie mit dem neuen boto3-Paket eine Variante hinzufügen?
Yeliabsalohcin

@yeliabsalohcin siehe meine Antwort
Casey

62

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


14
Fügen Sie das --recursiveFlag hinzu, um alle Objekte unter dem angegebenen Verzeichnis zu sehen
Chris Bloom

2
Gibt es eine Möglichkeit, die Namen zu analysieren? Ich möchte eine Liste von Dateien in einem S3-Bucket erstellen, um sie aufzuzählen.
Casey

Darüber hinaus codiert s3 die Dateinamen, die als URLs verwendet werden sollen. Dies sind nur unformatierte Dateinamen.
Casey

42

s3cmd ist für solche Dinge von unschätzbarem Wert

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


1
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:

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



Vielen Dank dafür, es fiel mir schwer, den Marker zu setzen: 1:
Adrian Magdas

20

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


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

Update: Die Antwort von @sysuser ist genau das, was ich brauchte.
Rinogo

@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

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


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

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

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

3
Die Änderung war erforderlich, da der ursprüngliche Code zu einem bestimmten Zeitpunkt nicht funktionierte.
Datageek

1
conn.lookupkehrt zurück, Noneanstatt einen S3ResponseError(NoSuchBucket)Fehler zu werfen
Ehtesh Choudhury


5

Für Pythons boto3 nach der Verwendung aws configure:

import boto3
s3 = boto3.resource('s3')

bucket = s3.Bucket('name')
for obj in bucket.objects.all():
    print(obj.key)

5

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

Hoffe das hilft.


funktioniert ... aber es dauert nicht lange, bis der ganze Eimer
fertig ist

4

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:

  1. Installieren Sie AWS CLI.
  2. Konfigurieren Sie die AWS-CLI für die Verwendung der Standardsicherheitsanmeldeinformationen und der Standard-AWS-Region.
  3. 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/


3

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());

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 exception

return [ key.name.encode( "utf-8" ) for key in bucket.list() ]

Vergessen Sie nicht, die <PLACE_HOLDERS> durch Ihre Werte zu ersetzen.


2

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

1

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:

  • s3: Alias ​​für Amazon S3
  • kline: AWS S3-Bucket-Name

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


Bitte vermeiden Sie es, den geheimen IAM-Schlüssel irgendwo weiterzugeben.
Alexey Vazhnov

1

Sie können Standard s3 API verwenden -

aws s3 ls s3://root/folder1/folder2/

1

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.


1

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


1
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
Welche S3-Klasse verwenden Sie? Wo kann ich das bekommen?
iDev247

0
# 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}'

3
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:

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.


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

}

2
Ich denke, das ist ein Java-Prototyp oder so, aber bitte erklären Sie es.
Doncho Gunchev

0

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.


0

Verwenden Sie Plumbum, um die CLI zu verpacken, und Sie erhalten eine klare Syntax:

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

0

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}"

-2

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.