수만 개의 파일 이름이있는 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
모든 파일이 표시됩니다.
답변
답변
아마존 목록은 1000 개의 파일 만 반환합니다. 모든 파일을 반복하려면 마커를 사용하여 결과를 페이지 매김해야합니다.
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