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


151

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


vdaubry가 제공 한 답변에 대한 jldupont의 의견에서 boto.s3.bucketlistresultset.BucketListResultSet언급 한 바와 같이, 질문에 언급 된 "수만 개의 파일 이름"조건을 다룹니다.
chb

1
수백만 또는 수십억 개의 객체가 많은 버킷의 경우 아래의 코딩 / 스크립트 접근 방식이 제대로 작동하지 않습니다. 대신 S3 인벤토리를 활성화하고 인벤토리 보고서를 검색해야합니다.
jarmod

답변:


120

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

3
다음을 얻는 경우 : boto.exception.S3ResponseError : S3ResponseError : 403 금지됨 Access / Secret 키에 대한 사용자 정책에 S3에 대한 액세스 권한이 있는지 확인하십시오.
topherjaynes

1
403 오류가 발생하여 작동하려면이 지침을 따라야했습니다. stackoverflow.com/a/22462419/1143558
Ljubisa Livac

bash에서 어떻게 반복합니까?
SuperUberDuper

4
새로운 boto3 패키지를 사용하여 변형을 추가 할 수 있습니까?
yeliabsalohcin은

@yeliabsalohcin 내 답변보기
Casey

62

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

모든 파일이 표시됩니다.


14
--recursive지정된 디렉토리 아래의 모든 객체를 보려면 플래그를 추가하십시오.
Chris Bloom

2
이름을 파싱하는 방법이 있습니까? 열거하기 위해 s3 버킷에 파일 목록을 만들려고합니다.
Casey

또한, s3는 URL로 사용될 파일 이름을 인코딩합니다. 이들은 원시 파일 이름 일뿐입니다.
Casey

42

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

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


1
s3cmd날짜별로 정렬 된 파일 이름을 반환합니다. 나중에 추가 된 파일 만 말할 수있는 방법이 2015-10-23 20:46있습니까?
SexyBeast

파일 이름에 공백이 있으면 작은 결함이 있지만이를 해결할 awk-foo는 없습니다.
Colin D

36

아마존 목록은 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

종료

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



감사합니다. 마커 설정 방법을 찾는 데 어려움을
겪었습니다

20

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


이것은 효과가 있지만 실제로 필요한 것은 아닙니다. 모든 "최상위"접두사 만 나열합니다. 버킷의 모든 객체, 접두사 및 모두를 얻는 방법이 있습니까?
rinogo

업데이트 : @sysuser대답 은 내가 필요한 것입니다.
rinogo 2018

@rinogo 그것은 당신의 요구에 맞지 않을 수도 있지만 ... 그것은 작동하고 그것이 여기에 중요합니다. 그것은 올바른 답변으로 다른 ppl의 요구에 맞습니다.
Khalil Gharbaoui 님의

내가 말했듯이, 작동합니다-감사합니다! 그러나 OP의 질문에 대답하지 않습니다. OP는 "버킷의 모든 파일 이름을"[목록] "으로 만들 것을 요청했습니다. 여기에는 모든 개체가 아닌 최상위 개체 만 나열 됩니다.
rinogo 2017

2
아하 그러나 그것은 어렵지 않습니다. 명령에 '--recursive'를 추가하십시오. 그 밖을 가리키는에 대한 내 대답 덕분에 추가 할 것입니다
칼릴 Gharbaoui에게

12

스칼라 개발자 에게는 공식 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 가 일반적으로 접근하는 것처럼


이 코드에 버그가 있습니다. 초기 스캔이 잘 리면 최종 반환은 mapped.toList이전의 것 없이 반환됩니다acc
Mark Wang

감사합니다. AmazonS3Client는 이제 AmazonS3이어야합니다.
Anthony Holland

11

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

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

aws가 이미 구성된 경우 2 행과 3 행을s3 = boto3.resource('s3')
sinapan

환경 변수가 있으면 session메소드 에서 변수를 사용할 필요가 없습니다 . AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID'] AWS_SECRET_ACCESS_KEY = os.environ['AWS_SECRET_ACCESS_KEY']
Flavio

7

zach 후 boto 도 추천 하지만 그의 코드와 약간의 차이를 만들어야했습니다.

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

3
원래 코드가 한 번에 작동하지 않았으므로 수정이 필요했습니다.
Datageek

1
conn.lookup반환 None대신에 던지는 S3ResponseError(NoSuchBucket)오류
Ehtesh Choudhury의


5

사용 후 파이썬의 boto3의 경우 aws configure:

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

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

5

먼저 메이크업 확실히 당신은에있는 instance terminal그리고 당신은 all accessS3IAM사용된다. 예를 들어 ec2 인스턴스를 사용했습니다.

pip3 install awscli

그런 다음 AWS 구성

aws configure

그런 다음 outcredantials를 작성하십시오.

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

이제 모든 버킷보기

aws s3 ls

모든 버킷 이름 저장

aws s3 ls > output.txt

버킷의 모든 파일 구조보기

aws s3 ls bucket-name --recursive

각 버킷에 파일 구조 저장

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

도움이 되었기를 바랍니다.


작동하지만 전체 버킷을 얻기 위해 e-e-ver가 필요합니다
gvasquez

4

AWS CLI를 사용하면 S3 버킷의 모든 파일을 빠르게 볼 수 있으며 다른 작업도 수행 할 수 있습니다.

AWS CLI를 사용하려면 다음 단계를 따르십시오.

  1. AWS CLI를 설치하십시오 .
  2. 기본 보안 자격 증명 및 기본 AWS 리전을 사용하도록 AWS CLI를 구성하십시오 .
  3. S3 버킷의 모든 파일을 보려면 명령을 사용하십시오.

    AWS s3 ls s3 : // your_bucket_name-재귀

다양한 AWS 서비스에 AWS cli 사용에 대한 참조 : https://docs.aws.amazon.com/cli/latest/reference/


3

Java에서는 ListObjects를 사용하여 키를 얻을 수 있습니다 ( 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());

버킷 이름을 사용하고 그 안에 존재하는 객체를 나열하는 간단한 API가 하나 더 있습니다. ObjectListing 객체 = s3client.listObjects (bucketName) javadoc 링크는 다음과 같습니다. docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/…
Rajesh

2

멋진 "boto"lib를 사용하여 파이썬으로 코딩하십시오 . 이 코드는 버킷에있는 파일 목록을 반환하고 누락 된 버킷에 대한 예외도 처리합니다.

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>를 값으로 바꾸는 것을 잊지 마십시오.


2

아래 명령은 AWS S3 버킷에서 모든 파일 이름을 가져와 현재 디렉토리의 텍스트 파일에 씁니다.

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

1

또는 Minio Client (일명 mc)를 사용할 수 있습니다. 오픈 소스이며 AWS S3와 호환됩니다. Linux, Windows, Mac, FreeBSD에서 사용할 수 있습니다 .

내용을 나열하기 위해 mc ls 명령 을 실행하기 만하면 됩니다.

$ 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

노트 :

  • s3 : Amazon S3의 별칭
  • 클라인 : AWS S3 버킷 이름

Minio Client Linux 설치 다음을 위한 mc 다운로드 :

chmod 755mc
$ ./mc --help

Minio Client를 사용하여 AWS 자격 증명 설정

$ mc 구성 호스트 추가 mys3 https://s3.amazonaws.com BKIKJAA5BMMU2RHO6IBB V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12

참고 : mys3을이 계정에 대해 원하는 별칭으로 바꾸고 BKIKJAA5BMMU2RHO6IBB, V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12를 AWS ACCESS-KEY 및 SECRET-KEY로 바꾸십시오.

도움이 되길 바랍니다.

면책 조항 : 나는 Minio에서 일합니다 .


IAM 비밀 키를 어디에서나 공유하지 마십시오.
Alexey Vazhnov

1

표준 s3 API를 사용할 수 있습니다-

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

1

다음 명령을 사용하여 aws s3 버킷에 모든 파일을 나열 할 수 있습니다

aws s3 ls path/to/file

파일로 저장하려면

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

결과를 파일에 추가하려면 다음을 수행하십시오.

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

이전에 작성된 내용을 지우려면

Windows와 Linux 모두에서 작동합니다.


1

자바 스크립트에서 사용할 수 있습니다

s3.listObjects (매개 변수, 함수 (오류, 결과) {});

버킷 내부의 모든 객체를 가져옵니다. 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
어떤 S3 클래스를 사용하고 있습니까? 어디서 구할 수 있습니까?
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
이 코드 스 니펫은 제한적이고 즉각적인 도움이 될 수 있습니다. 적절한 설명 이것이 문제에 대한 좋은 해결책 인지 보여줌으로써 장기적인 가치를 크게 향상시킬 것이며, 다른 비슷한 질문을 가진 미래 독자들에게 더 유용 할 것입니다. 제발 편집 당신이 만든 가정 등 일부 설명을 추가 할 답변을.
Toby Speight

0

Paolo의 간단하고 업데이트 된 Scala 답변 버전 :

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

제네릭을 제거하고 SDK 빌더가 생성 한 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
나는 이것이 Java 프로토 타입 또는 무언가라고 생각하지만 그것을 설명하십시오.
Doncho Gunchev

0

PHP에서는 다음 호출을 사용하여 특정 버킷 내에서 AWS-S3 객체의 전체 목록을 얻을 수 있습니다

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

위 코드의 출력을 파일로 리디렉션하여 키 목록을 가져올 수 있습니다.


0

plumbum을 사용하여 cli를 감싸면 명확한 구문이 있습니다.

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

0

이 bash 스크립트를 사용해보십시오. 외부 의존성이 필요없는 curl 명령을 사용합니다.

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

매우 유용한 텍스트 파일을 얻는 가장 쉬운 방법은 S3 브라우저 http://s3browser.com/ 을 다운로드 하고 웹 URL 생성기를 사용하여 전체 링크 경로 목록을 생성하는 것입니다. 매우 편리하며 약 3 회의 클릭이 포함됩니다.

-Browse to Folder
-Select All
-Generate Urls

행운을 빈다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.