Amazon S3 demetindeki tüm dosyaları listelemenin hızlı yolu?


151

İçinde on binlerce dosya adı bulunan bir amazon s3 kovam var. Gruptaki tüm dosya adlarını listeleyen bir metin dosyası almanın en kolay yolu nedir?


Jldupont'un vdaubry tarafından verilen cevap hakkındaki yorumunda da boto.s3.bucketlistresultset.BucketListResultSetbelirtildiği gibi, soruda belirtilen "on binlerce dosya adı" koşuluna değiniyor .
chb

1
Milyonlarca veya milyarlarca gibi çok fazla sayıda nesneye sahip kovalar için, aşağıdaki kodlama / komut dosyası oluşturma yaklaşımlarının iyi çalışmayacağını unutmayın. Bunun yerine S3 Envanteri'ni etkinleştirmeli ve bir envanter raporu almalısınız.
jarmod

Yanıtlar:


120

Boto kullanmanızı tavsiye ederim . Sonra hızlı bir çift ​​python satırı :

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

Bunu list.py kaydedin, bir terminal açın ve çalıştırın:

$ python list.py > results.txt

3
Şunları alırsanız: boto.exception.S3ResponseError: S3ResponseError: 403 Yasak Erişim / Gizli anahtarının kullanıcı ilkesinin S3'e erişimi olduğundan emin olun.
topherjaynes

1
403 hatası aldım ve çalışması için bu talimatları
izlemem

nasıl bash içinde döngü?
SuperUberDuper

4
Yeni boto3 paketini kullanarak buna bir değişken ekleyebilir misiniz?
yeliabsalohcin

@yeliabsalohcin cevabımı gör
Casey

62

AWS CLI

Aws s3 ls belgeleri

AWS son zamanlarda Komut Satırı Araçlarını yayınladı. Bu çok Boto gibi çalışır ve kullanarak monte edilebilir sudo easy_install awscliveyasudo pip install awscli

Yükledikten sonra,

aws s3 ls

Bu size mevcut tüm kovalarınızı gösterecek

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

Daha sonra dosyalar için belirli bir grubu sorgulayabilirsiniz.

Komut :

aws s3 ls s3://mybucket

Çıktı :

Bucket: mybucket
Prefix:

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

Bu size tüm dosyalarınızı gösterecektir.


14
--recursiveBelirtilen dizindeki tüm nesneleri görmek için bayrağı ekleyin
Chris Bloom

2
İsimleri ayrıştırmanın bir yolu var mı? Üzerinde numaralandırmak için bir s3 kova dosya listesi yapmak için arıyorum.
Casey

Ayrıca, s3 URL olarak kullanılacak dosya adlarını kodlar, bunlar sadece ham dosya
Casey

42

s3cmd bu tür şeyler için paha biçilmezdir

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


1
s3cmdtarihe göre sıralanmış dosya adlarını döndürür. Sadece sonradan eklenen dosyaları söyletmek için herhangi bir yolu var 2015-10-23 20:46mı?
SexyBeast

Dosya adlarının boşlukları varsa, bunun küçük bir aksaklığı olduğunu unutmayın, ancak düzeltmek için awk-foo'm yok
Colin D

36

Dikkatli olun, amazon listesi sadece 1000 dosya döndürür. Tüm dosyalar üzerinde yineleme yapmak istiyorsanız, sonuçları işaretçileri kullanarak sayfalandırmanız gerekir:

Aws-s3 kullanarak yakut

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

son

Umarım bu yardımcı olur, vincent



Bunun için teşekkürler, işaretçiyi nasıl ayarlayacağımı bulmakta zorlandım: 1:
Adrian Magdas

20

Güncelleme 15-02-2019:

Bu komut size AWS S3'teki tüm kovaların bir listesini verecektir:

aws s3 ls

Bu komut size bir AWS S3 grubundaki tüm üst düzey nesnelerin bir listesini verecektir:

aws s3 ls bucket-name

Bu komut size bir AWS S3 grubundaki TÜM nesnelerin bir listesini verecektir:

aws s3 ls bucket-name --recursive

Bu komut, TÜMÜN listesini bir AWS S3 grubunun içine yerleştirir ... geçerli dizininizdeki bir metin dosyasına:

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


Bu çalışıyor ama gerçekten ihtiyacım olan şey değil. Yalnızca tüm "üst düzey" önekleri listeler. Bir gruptaki tüm nesneleri, önekleri ve tümünü almanın bir yolu var mı?
rinogo

Güncelleme: @sysuser'ın cevabı ihtiyacım olan şey.
rinogo

@rinogo Belki sizin ihtiyaçlarınıza uymuyor ... ama işe yarıyor ve önemli olan bu. Doğru bir cevap olarak diğer kişi ihtiyacına uyar.
Khalil Gharbaoui

Dediğim gibi, işe yarıyor - teşekkürler! Ancak OP'nin sorusuna cevap vermiyor. OP "gruptaki tüm dosya adlarını listelemenin" bir yolunu istedi. Bu yalnızca üst düzey nesneleri listeler, tüm nesneleri listeler .
rinogo

2
Aha ama bunu yapmak zor değil. Sadece '--recursive' komutunu eklemeniz yeterlidir. Bunu cevabım için eklediğim için teşekkür ederim
Khalil Gharbaoui

12

Scala geliştiricileri için, burada Java için resmi AWS SDK'yı kullanarak tam bir tarama yürütmek ve AmazonS3 grubunun içeriğini eşlemek yinelemeli bir işlevdir

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

Yukarıdaki curried map()işlevi çağırmak için , önceden oluşturulmuş (ve düzgün başlatılmış) AmazonS3Client nesnesini ( Java API Başvurusu için resmi AWS SDK'sına bakın ), grup adını ve ilk parametre listesindeki önek adını iletmeniz yeterlidir . Ayrıca f(), ikinci parametre listesindeki her nesne özetini eşlemek için uygulamak istediğiniz işlevi iletin.

Örneğin

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

(key, owner)bu gruptaki / önekteki tuplesların tam listesini döndürür

veya

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

İşlevsel Programlamada normalde Monads tarafından yaklaşacağınız gibi


Bu kodda bir hata var. İlk tarama kesilirse, son dönüş yalnızca mapped.toListöncekilerden herhangi biri olmadan geri döneracc
Mark Wang

Teşekkürler - AmazonS3Client'in artık sadece AmazonS3 olması gerektiğini unutmayın.
Anthony Holland

11

Bu konuda kullanabileceğiniz birkaç yol var. Python Kullanımı

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)

Başka bir yol bunun için AWS cli kullanmaktır

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

aws zaten yapılandırılmışsa, bir satır 2 ve 3 ile değiştirilebilirs3 = boto3.resource('s3')
sinapan

Ortam değişkenlerini yerleştirdiyseniz, sessionyöntemdeki değişkenleri kullanmanız gerekmez . AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID'] AWS_SECRET_ACCESS_KEY = os.environ['AWS_SECRET_ACCESS_KEY']
Flavio

7

Zach sonra ben de boto tavsiye ederim , ama onun kodunda küçük bir fark yapmak gerekiyordu:

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

3
Orijinal kod aynı anda çalışmadığından değişiklik gerekliydi.
Datageek

1
conn.lookuphata Noneatmak yerine geri dönerS3ResponseError(NoSuchBucket)
Ehtesh Choudhury


5

Kullandıktan sonra Python'un boto3'ü için aws configure:

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

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

5

İlk yapmak emin bir Hangi instance terminalve sahip all accessarasında S3yer IAMkullandığınız. Örneğin bir ec2 örneği kullandım.

pip3 install awscli

Ardından aws'ı yapılandırın

aws configure

Sonra dış referansları doldurun: -

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

Şimdi, tüm kovaları görün

aws s3 ls

Tüm kovaların adını sakla

aws s3 ls > output.txt

Tüm dosya yapısını bir grupta görün

aws s3 ls bucket-name --recursive

Dosya yapısını her grupta sakla

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

Bu yardımcı olur umarım.


çalışır ... ama tüm kova almak için e-ver alır
gvasquez

4

AWS CLI, bir S3 kovasının tüm dosyalarını hızlı bir şekilde görmenize ve diğer işlemleri gerçekleştirmenize yardımcı olabilir.

AWS CLI'yi kullanmak için aşağıdaki adımları izleyin:

  1. AWS CLI'yı yükleyin .
  2. AWS CLI'yı varsayılan güvenlik kimlik bilgilerini ve varsayılan AWS Bölgesi'ni kullanacak şekilde yapılandırın .
  3. S3 grubunun tüm dosyalarını görmek için komutunu kullanın

    aws s3 ls s3: // your_bucket_name - yinelenen

Farklı AWS hizmetleri için AWS cli kullanma referansı: https://docs.aws.amazon.com/cli/latest/reference/


3

Java'da anahtarları ListObjects kullanarak alabilirsiniz ( AWS belgelerine bakın )

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

Grup adını alan ve içinde bulunan nesneleri listeleyen daha basit bir API var. ObjectListing objects = s3client.listObjects (bucketName) javadoc bağlantısı aşağıda verilmiştir, docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/…
Rajesh

2

Müthiş "boto" lib kullanarak python kodlayın . Kod, bir gruptaki dosyaların listesini döndürür ve ayrıca eksik kovalar için özel durumları işler.

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

<PLACE_HOLDERS> değerini değerlerinizle değiştirmeyi unutmayın.


2

Aşağıdaki komut tüm dosya adlarını AWS S3 grubunuzdan alır ve geçerli dizininizdeki metin dosyasına yazar:

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

1

Alternatif olarak Minio Client aka mc de kullanabilirsiniz. Açık Kaynak ve AWS S3 ile uyumludur. Bu kullanılabilir Linux, Windows, Mac, FreeBSD.

Tüm yapmanız gereken içeriği listelemek için mc ls komutunu çalıştırmaktır .

$ 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] 50 KB pi.png
[2016-05-10 14:34:39 IST] 365KiB upton.pdf

Not:

  • s3: Amazon S3 için diğer ad
  • kline: AWS S3 kepçe adı

Minio İstemci Linux'u Yükleme mc for:

chmod 755 $
$ ./mc --help

Minio Client ile AWS kimlik bilgilerini ayarlama

$ mc config ana bilgisayar ekle mys3 https://s3.amazonaws.com BKIKJAA5BMMU2RHO6IBB V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12

Not: Lütfen mys3'ü bu hesap için istediğiniz takma adla değiştirin ve BKIKJAA5BMMU2RHO6IBB, V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12 ile AWS ACCESS-KEY ve SECRET-KEY

Umarım yardımcı olur.

Feragatname: Minio için çalışıyorum


Lütfen IAM gizli anahtarını herhangi bir yerde paylaşmaktan kaçının.
Alexey Vazhnov

1

Standart s3 api kullanabilirsiniz -

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

1

Aws s3 grubundaki tüm dosyaları aşağıdaki komutu kullanarak listeleyebilirsiniz

aws s3 ls path/to/file

ve bir dosyaya kaydetmek için şunu kullanın:

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

sonucunuzu başka bir dosyaya eklemek istiyorsanız:

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

daha önce yazılanları temizlemek istiyorsanız.

Hem Windows hem de Linux'ta çalışacaktır.


1

Javascript'te şunları kullanabilirsiniz:

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

tüm nesneleri kova içine almak için. kova adını params içine iletmeniz gerekir (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
Hangi S3 sınıfını kullanıyorsunuz? Nereden temin edebilirim?
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
Sınırlı ve anında yardım sağlayabilecek bu kod snippet'i için teşekkür ederiz. Uygun bir açıklama , bunun neden problem için iyi bir çözüm olduğunu göstererek uzun vadeli değerini büyük ölçüde artıracak ve diğer benzer sorularla gelecekteki okuyucular için daha yararlı hale getirecektir. Yaptığınız varsayımlar dahil bazı açıklamalar eklemek için lütfen yanıtınızı düzenleyin .
Toby Speight

0

Paolo'nun Scala cevabının basitleştirilmiş ve güncellenmiş versiyonu:

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

Jeneriklerin çıkarılması ve SDK oluşturucuları tarafından oluşturulan ListObjectRequest'in kullanılması.


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
Sanırım bu Java prototipi falan ama açıklayınız.
Doncho Gunchev

0

PHP'de, aşağıdaki çağrıyı kullanarak belirli bir kova içindeki AWS-S3 nesnelerinin tam listesini alabilirsiniz

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

Anahtarların listesini almak için yukarıdaki kodun çıktısını bir dosyaya yönlendirebilirsiniz.


0

Klibi sarmak için plumbum kullanın ve net bir sözdizimine sahip olacaksınız:

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

0

lütfen bu bash betiğini deneyin. herhangi bir harici bağımlılığa gerek olmadan curl komutunu kullanır

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

Çok kullanışlı bir metin dosyası almanın en kolay yolu S3 Tarayıcı http://s3browser.com/ indirmek ve tam bağlantı yollarının bir listesini üretmek için Web URLs Generator'ı kullanmaktır. Çok kullanışlıdır ve yaklaşık 3 tıklama içerir.

-Browse to Folder
-Select All
-Generate Urls

Size iyi şanslar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.