Cara cepat untuk membuat daftar semua file di Amazon S3 bucket?


151

Saya memiliki ember amazon s3 yang memiliki puluhan ribu nama file di dalamnya. Apa cara termudah untuk mendapatkan file teks yang mencantumkan semua nama file di dalam ember?


Seperti disinggung oleh komentar jldupont tentang jawaban yang diberikan oleh vdaubry, boto.s3.bucketlistresultset.BucketListResultSetalamat kondisi "puluhan ribu nama file" yang disebutkan dalam pertanyaan.
chb

1
Ketahuilah bahwa untuk keranjang dengan jumlah objek yang sangat besar, misalnya jutaan atau milyaran, pendekatan pengkodean / skrip di bawah ini tidak akan berfungsi dengan baik. Anda sebaiknya mengaktifkan S3 Inventory dan mengambil laporan inventaris.
jarmod

Jawaban:


120

Saya akan merekomendasikan menggunakan boto . Maka beberapa baris python cepat :

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

Simpan ini sebagai list.py, buka terminal, dan kemudian jalankan:

$ python list.py > results.txt

3
Jika Anda mendapatkan: boto.exception.S3ResponseError: S3ResponseError: 403 Forbidden Pastikan kebijakan pengguna untuk kunci Akses / Rahasia memiliki akses ke S3.
topherjaynes

1
Saya mendapat kesalahan 403, dan saya harus mengikuti instruksi ini untuk membuatnya berfungsi: stackoverflow.com/a/22462419/1143558
Ljubisa Livac

bagaimana Anda mengulanginya di bash?
SuperUberDuper

4
Bisakah Anda menambahkan varian untuk ini menggunakan paket boto3 baru?
yeliabsalohcin

@yeliabsalohcin lihat jawaban saya
Casey

62

AWS CLI

Dokumentasi untuk aws s3 ls

AWS baru-baru ini merilis Alat Baris Perintah mereka. Ini berfungsi seperti boto dan dapat diinstal menggunakan sudo easy_install awscliatausudo pip install awscli

Setelah Anda menginstal, Anda dapat menjalankannya

aws s3 ls

Yang akan menunjukkan semua ember yang tersedia

CreationTime Bucket
       ------------ ------
2013-07-11 17:08:50 mybucket
2013-07-24 14:55:44 mybucket2

Anda kemudian dapat meminta ember khusus untuk file.

Perintah :

aws s3 ls s3://mybucket

Output :

Bucket: mybucket
Prefix:

      LastWriteTime     Length Name
      -------------     ------ ----
                           PRE somePrefix/
2013-07-25 17:06:27         88 test.txt

Ini akan menunjukkan kepada Anda semua file Anda.


14
Tambahkan --recursivebendera untuk melihat semua objek di bawah direktori yang ditentukan
Chris Bloom

2
Apakah ada cara untuk menguraikan nama? Saya mencari untuk membuat daftar file dalam ember s3 untuk disebutkan.
Casey

selain itu, s3 mengkodekan nama file untuk digunakan sebagai URL, ini hanya nama file mentah ..
Casey

42

s3cmd sangat berharga untuk hal semacam ini

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


1
s3cmdmengembalikan nama file yang diurutkan berdasarkan tanggal. Apakah ada cara saya bisa mengembalikannya dengan mengatakan hanya file-file yang telah ditambahkan setelahnya 2015-10-23 20:46?
SexyBeast

Perhatikan bahwa jika nama file memiliki spasi, ini memiliki kesalahan kecil tapi saya tidak punya awk-foo untuk memperbaikinya
Colin D

36

Hati-hati, daftar amazon hanya mengembalikan 1000 file. Jika Anda ingin mengulang semua file, Anda harus memberi paginasi hasil menggunakan penanda:

Dalam ruby ​​menggunakan 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

akhir

Semoga ini bisa membantu, vincent



Terima kasih untuk ini, saya kesulitan menemukan cara mengatur penanda: 1:
Adrian Magdas

20

Pembaruan 15-02-2019:

Perintah ini akan memberi Anda daftar semua ember di AWS S3:

aws s3 ls

Perintah ini akan memberi Anda daftar semua objek tingkat atas di dalam AWS S3 bucket:

aws s3 ls bucket-name

Perintah ini akan memberi Anda daftar SEMUA objek di dalam ember AWS S3:

aws s3 ls bucket-name --recursive

Perintah ini akan menempatkan daftar ALL di dalam kotak AWS S3 ... di dalam file teks di direktori Anda saat ini:

aws s3 ls bucket-name --recursive | cat >> file-name.txt


Ini berfungsi tetapi sebenarnya bukan yang saya butuhkan. Itu hanya daftar semua awalan "tingkat atas". Apakah ada cara untuk mendapatkan semua objek dalam ember, awalan, dan semua?
rinogo

Pembaruan: Jawaban oleh @sysuser adalah yang saya butuhkan.
rinogo

@rinogo Mungkin tidak sesuai dengan kebutuhan Anda ... tetapi berfungsi dan itulah yang terpenting di sini. Ini cocok dengan kebutuhan ppl lain sebagai jawaban yang benar.
Khalil Gharbaoui

Seperti yang saya katakan, itu berfungsi - terima kasih! Tapi itu tidak menjawab pertanyaan OP. OP meminta cara untuk "[daftar] semua nama file dalam ember". Ini hanya mencantumkan objek tingkat atas, tidak semua objek.
rinogo

2
Aha tapi itu tidak sulit dilakukan. Cukup tambahkan '--recursive' ke perintah. Saya akan menambahkannya ke jawaban saya, terima kasih untuk menunjukkannya
Khalil Gharbaoui

12

Untuk pengembang Scala, ini dia fungsi rekursif untuk melakukan pemindaian penuh dan memetakan isi ember AmazonS3 menggunakan AWS SDK resmi untuk 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))
}

Untuk menjalankan map()fungsi kari di atas , cukup lewati objek AmazonS3Client yang sudah dibangun (dan diinisialisasi dengan benar) (merujuk ke AWS SDK resmi untuk Referensi API Java ), nama bucket dan nama awalan dalam daftar parameter pertama. Juga lewati fungsi f()yang ingin Anda terapkan untuk memetakan setiap ringkasan objek dalam daftar parameter kedua.

Sebagai contoh

val keyOwnerTuples = map(s3, bucket, prefix)(s => (s.getKey, s.getOwner))

akan mengembalikan daftar (key, owner)tupel lengkap dalam ember / awalan

atau

map(s3, "bucket", "prefix")(s => println(s))

seperti yang biasa Anda lakukan dengan Monads dalam Pemrograman Fungsional


Ada bug dengan kode ini. Jika Pemindaian awal terpotong, pengembalian akhir hanya akan kembali mapped.toListtanpa yang sebelumnyaacc
Mark Wang

Terima kasih - perhatikan bahwa AmazonS3Client sekarang seharusnya hanya AmazonS3.
Anthony Holland

11

Ada beberapa cara untuk melakukannya. Menggunakan 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)

Cara lain adalah menggunakan AWS cli untuk itu

aws s3 ls s3://{bucketname}
example : aws s3 ls s3://testbucket133

jika aws sudah dikonfigurasi, seseorang dapat mengganti jalur 2 dan 3 dengans3 = boto3.resource('s3')
savigasi

Jika Anda menempatkan variabel lingkungan, Anda tidak perlu menggunakan variabel dalam sessionmetode. AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID'] AWS_SECRET_ACCESS_KEY = os.environ['AWS_SECRET_ACCESS_KEY']
Flavio

7

Setelah zach saya juga akan merekomendasikan boto , tetapi saya perlu membuat sedikit perbedaan pada kode-nya:

conn = boto.connect_s3('access-key', 'secret'key')
bucket = conn.lookup('bucket-name')
for key in bucket:
    print key.name

3
Modifikasi itu diperlukan karena kode asli tidak berfungsi sekaligus.
Datageek

1
conn.lookupkembali Nonebukannya melemparkan S3ResponseError(NoSuchBucket)kesalahan
Ehtesh Choudhury


5

Untuk boto3 Python setelah menggunakan aws configure:

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

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

5

Pertama make yakin Anda berada di instance terminaldan Anda memiliki all accessdari S3dalam IAMyang Anda gunakan. Sebagai contoh saya menggunakan contoh EC2.

pip3 install awscli

Kemudian Konfigurasikan aws

aws configure

Kemudian, isi laporan: -

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

Sekarang, Lihat semua ember

aws s3 ls

Simpan semua nama bucket

aws s3 ls > output.txt

Lihat semua struktur file dalam ember

aws s3 ls bucket-name --recursive

Simpan struktur file di setiap ember

aws s3 ls bucket-name --recursive > file_Structure.txt

Semoga ini membantu.


berfungsi ... tetapi membutuhkan for-e-ver untuk mendapatkan seluruh ember
gvasquez

4

AWS CLI dapat memungkinkan Anda melihat semua file bucket S3 dengan cepat dan membantu dalam melakukan operasi lain juga.

Untuk menggunakan AWS CLI ikuti langkah-langkah di bawah ini:

  1. Instal AWS CLI.
  2. Mengkonfigurasi AWS CLI untuk menggunakan kredensial keamanan default dan Wilayah AWS default.
  3. Untuk melihat semua file dari bucket S3 gunakan perintah

    aws s3 ls s3: // your_bucket_name --recursive

Referensi untuk menggunakan AWS cli untuk berbagai layanan AWS: https://docs.aws.amazon.com/cli/latest/reference/


3

Di Jawa Anda bisa mendapatkan kunci menggunakan ListObjects (lihat dokumentasi 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());

Ada satu lagi API sederhana yang tersedia, yang mengambil nama bucket dan mencantumkan objek yang ada di dalamnya. ObjectListing objects = s3client.listObjects (bucketName) tautan javadoc diberikan di bawah ini, docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/…
Rajesh

2

Kode dalam python menggunakan the awesome lib "boto" yang . Kode mengembalikan daftar file dalam ember dan juga menangani pengecualian untuk ember yang hilang.

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

Jangan lupa ganti <PLACE_HOLDERS> dengan nilai Anda.


2

Perintah di bawah ini akan mendapatkan semua nama file dari AWS S3 bucket Anda dan menulis ke dalam file teks di direktori Anda saat ini:

aws s3 ls s3://Bucketdirectory/Subdirectory/ | cat >> FileNames.txt

1

Atau Anda dapat menggunakan Minio Client alias mc. Open Source dan kompatibel dengan AWS S3. Ini tersedia untuk Linux, Windows, Mac, FreeBSD.

Yang harus Anda lakukan adalah menjalankan perintah mc ls untuk membuat daftar konten.

$ 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

catatan:

  • s3: Alias ​​untuk Amazon S3
  • kline: nama bucket AWS S3

Menginstal Minio Client Linux Unduh mc untuk:

$ chmod 755 mc
$ ./mc --help

Menyiapkan kredensial AWS dengan Minio Client

$ mc config host tambahkan mys3 https://s3.amazonaws.com BKIKJAA5BMMU2RHO6IBB V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12

Catatan: Silakan ganti mys3 dengan alias Anda ingin untuk akun ini dan, BKIKJAA5BMMU2RHO6IBB, V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12 dengan AWS ACCESS-KEY dan RAHASIA-KUNCI

Semoga ini bisa membantu.

Penafian: Saya bekerja untuk Minio


Harap hindari berbagi kunci rahasia IAM di mana saja.
Alexey Vazhnov

1

Anda dapat menggunakan api s3 standar -

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

1

Anda dapat membuat daftar semua file, di aws s3 bucket menggunakan perintah

aws s3 ls path/to/file

dan untuk menyimpannya dalam file, gunakan

aws s3 ls path/to/file >> save_result.txt

jika Anda ingin menambahkan hasil Anda dalam file sebaliknya:

aws s3 ls path/to/file > save_result.txt

jika Anda ingin menghapus apa yang ditulis sebelumnya.

Ini akan bekerja di windows dan Linux.


1

Dalam javascript Anda bisa menggunakan

s3.listObjects (params, function (err, result) {});

untuk mendapatkan semua benda di dalam ember. Anda harus memasukkan nama bucket di dalam params (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
Kelas S3 mana yang Anda gunakan? Di mana saya bisa mendapatkannya?
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
Terima kasih atas cuplikan kode ini, yang mungkin memberikan bantuan terbatas dan segera. Penjelasan yang tepat akan sangat meningkatkan nilai jangka panjangnya dengan menunjukkan mengapa ini adalah solusi yang baik untuk masalah ini, dan akan membuatnya lebih bermanfaat bagi pembaca masa depan dengan pertanyaan lain yang serupa. Harap edit jawaban Anda untuk menambahkan beberapa penjelasan, termasuk asumsi yang Anda buat.
Toby Speight

0

Versi Scala yang disederhanakan dan diperbarui oleh 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))
}

Melucuti obat generik dan menggunakan ListObjectRequest yang dihasilkan oleh pembuat SDK.


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
Saya kira ini adalah prototipe Java atau sesuatu, tapi tolong jelaskan.
Doncho Gunchev

0

Di PHP Anda bisa mendapatkan daftar lengkap objek AWS-S3 di dalam bucket tertentu menggunakan panggilan berikut

$S3 = \Aws\S3\S3Client::factory(array('region' => $region,));
$iterator = $S3->getIterator('ListObjects', array('Bucket' => $bucket));
foreach ($iterator as $obj) {
    echo $obj['Key'];
}

Anda dapat mengarahkan output kode di atas ke file untuk mendapatkan daftar kunci.


0

Gunakan timah hitam untuk membungkus cli dan Anda akan memiliki sintaks yang jelas:

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

0

silakan coba skrip bash ini. ia menggunakan perintah curl tanpa perlu ketergantungan eksternal

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

Cara termudah untuk mendapatkan file teks yang sangat bermanfaat adalah dengan mengunduh S3 Browser http://s3browser.com/ dan menggunakan Generator URL Web untuk menghasilkan daftar jalur tautan lengkap. Ini sangat berguna dan melibatkan sekitar 3 klik.

-Browse to Folder
-Select All
-Generate Urls

Semoga beruntung untukmu.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.