[amazon-s3] Amazon S3 버킷의 모든 파일을 나열하는 빠른 방법은 무엇입니까?

수만 개의 파일 이름이있는 Amazon S3 버킷이 있습니다. 버킷의 모든 파일 이름을 나열하는 텍스트 파일을 얻는 가장 쉬운 방법은 무엇입니까?



답변

boto 사용하는 것이 좋습니다 . 그런 다음 몇 줄의 파이썬입니다 .

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

이것을 list.py로 저장하고 터미널을 연 후 다음을 실행하십시오.

$ python list.py > results.txt


답변

AWS CLI

AWS S3 LS에 대한 설명서

AWS는 최근 명령 줄 도구를 출시했습니다. 이 훨씬 BOTO처럼 작동 및 사용하여 설치할 수 있습니다 sudo easy_install awscli또는sudo pip install awscli

설치 한 후에는 간단하게 실행할 수 있습니다

aws s3 ls

사용 가능한 모든 버킷이 표시됩니다.

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

그런 다음 파일에 대해 특정 버킷을 쿼리 할 수 ​​있습니다.

사령부 :

aws s3 ls s3://mybucket

출력 :

Bucket: mybucket
Prefix:

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

모든 파일이 표시됩니다.


답변

s3cmd 는 이런 종류의 것에 매우 중요합니다

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


답변

아마존 목록은 1000 개의 파일 만 반환합니다. 모든 파일을 반복하려면 마커를 사용하여 결과를 페이지 매김해야합니다.

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

종료

이게 도움이 되길 바래, 빈센트


답변

15-02-2019 업데이트 :

이 명령은 AWS S3의 모든 버킷 목록을 제공합니다.

aws s3 ls

이 명령은 AWS S3 버킷 내부의 모든 최상위 객체 목록을 제공합니다.

aws s3 ls bucket-name

이 명령은 AWS S3 버킷 내부의 모든 객체 목록을 제공합니다.

aws s3 ls bucket-name --recursive

이 명령은 AWS S3 버킷 내부의 ALL 목록을 현재 디렉토리의 텍스트 파일 내에 배치합니다.

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


답변

스칼라 개발자 에게는 공식 AWS SDK for Java를 사용하여 전체 스캔 을 실행하고 AmazonS3 버킷의 내용을 매핑 하는 재귀 함수 입니다.

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

위의 커리 map()함수 를 호출하려면 첫 번째 파라미터 목록에서 이미 생성 된 (및 올바르게 초기화 된) AmazonS3Client 객체 (공식 AWS SDK for Java API Reference 참조 ), 버킷 이름 및 접두사 이름을 전달하면됩니다. 또한 f()적용하려는 함수 를 전달하여 두 번째 매개 변수 목록에서 각 객체 요약을 매핑합니다.

예를 들어

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

(key, owner)해당 버킷 / 접두사 에 튜플 의 전체 목록을 반환합니다.

또는

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

함수형 프로그래밍에서 Monads 가 일반적으로 접근하는 것처럼


답변

당신이 그것에 대해 갈 수있는 몇 가지 방법이 있습니다. 파이썬 사용하기

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)

다른 방법은 AWS CLI를 사용하는 것입니다

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