Amazon S3バケット内のすべてのファイルを一覧表示する簡単な方法は?


151

何万ものファイル名が入ったamazon s3バケットがあります。バケット内のすべてのファイル名をリストするテキストファイルを取得する最も簡単な方法は何ですか?


vdaubryによって提供された回答に関するjldupontのコメントでboto.s3.bucketlistresultset.BucketListResultSet言及したように、質問で言及された「数万のファイル名」の状態に 対処します。
2013年

1
非常に多数のオブジェクト(数百万または数十億など)を持つバケットの場合、以下のコーディング/スクリプトアプローチは適切に機能しないことに注意してください。代わりに、S3インベントリを有効にして、インベントリレポートを取得する必要があります。
jarmod

回答:


120

botoの使用をお勧めします。それからそれはpythonの簡単な数行です

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 Forbidden Access / SecretキーのユーザーポリシーがS3にアクセスできることを確認してください。
topherjaynes 2014年

1
私は403エラーを得た、と私は仕事にそれを作るためには、この指示に従ってくださいする必要がありました:stackoverflow.com/a/22462419/1143558
Ljubisa Livac

どのようにbashでそれをループしますか?
SuperUberDuper 2017年

4
新しいboto3パッケージを使用して、これにバリアントを追加できますか?
yeliabsalohcin

@yeliabsalohcin私の答えを見てください
ケーシー

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バケット内のファイルのリストを作成しようとしています。
ケーシー

加えて、S3エンコードURLとして使用するファイル名、これらは単なる生のファイル名..です
ケーシー

42

s3cmdはこの種のものにとって非常に貴重です

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


1
s3cmd日付でソートされたファイル名を返します。後に追加されたファイルだけを返すようにする方法はあります2015-10-23 20:46か?
SexyBeast 2015年

ファイル名にスペースがある場合、これには小さな不具合がありますが、それを修正するawk-fooがないことに注意してください
Colin D

36

アマゾンリストは1000ファイルしか返さないことに注意してください。すべてのファイルを反復処理する場合は、マーカーを使用して結果をページ分割する必要があります。

Rubyで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

終わり

これが役立つことを願って、vincent


7
botoはページングを処理します。github.com
develop /

このおかげで、マーカーを設定する方法を見つけるのに苦労しました:1:
エイドリアン・マグダス

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バケット内に配置します...現在のディレクトリ内のテキストファイル内:

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


これは機能しますが、実際に必要なものではありません。すべての「トップレベル」プレフィックスがリストされているだけです。バケット内のすべてのオブジェクト、プレフィックス、およびすべてを取得する方法はありますか?
rinogo

更新:@sysuser答えが必要でした。
rinogo

@rinogoそれは多分あなたのニーズに適合しません...しかし、それは機能し、それがここで重要です。それは正解として他のPPLのニーズに適合します。
Khalil Gharbaoui、

私が言ったように、それはうまくいきます-ありがとう!しかし、それはOPの質問には答えません。OPは、「[バケット]内のすべてのファイル名をリストする」方法を求めました。これは、すべてのオブジェクトではなく、トップレベルのオブジェクトのみをリストます。
rinogo

2
ああ、それは難しいことではありません。コマンドに「--recursive」を追加するだけです。私はそれを指摘してくれたおかげで私の回答に追加します
Khalil Gharbaoui

12

Scala開発者のために、フルスキャンを実行し、公式の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リファレンスを参照)、バケット名、最初のパラメーターリストのプレフィックス名を渡すだけです。またf()、2番目のパラメーターリストの各オブジェクトの概要をマップするために適用する関数を渡します。

例えば

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

(key, owner)そのバケット/プレフィックスのタプルの完全なリストを返します

または

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

関数型プログラミングでモナドが通常アプローチするように


このコードにはバグがあります。最初のスキャンが切り捨てられた場合、最後の戻りはmapped.toList前のスキャンなしでのみ戻りますacc
Mark Wang

ありがとうございます。AmazonS3Clientは、AmazonS3になっているはずです。
Anthony Holland

11

あなたがそれについて行くことができるいくつかの方法があります。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)

別の方法は、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']
フラビオ

7

ザックの後、私はbotoもお勧めしますが、彼のコードに少し違いをつける必要がありました:

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

3
元のコードが一度に機能しなかったため、変更が必要でした。
Datageek 2013

1
conn.lookupエラーNoneをスローする代わりに戻るS3ResponseError(NoSuchBucket)
Ehtesh Choudhury 2014


5

Pythonの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持っていることを確認してください。たとえば、ec2インスタンスを使用しました。all accessS3IAM

pip3 install awscli

次にawsを設定します

aws configure

次に、excredantials ex:-

$ 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

お役に立てれば。


動作します...しかし、バケット全体を取得するために
事前に準備

4

AWS CLIを使用すると、S3バケットのすべてのファイルをすばやく表示し、他の操作の実行にも役立ちます。

AWS CLIを使用するには、次の手順に従います。

  1. AWS CLI をインストールします。
  2. デフォルトのセキュリティ認証情報とデフォルトのAWSリージョンを使用するようにAWS CLIを設定します。
  3. S3バケットのすべてのファイルを表示するには、次のコマンドを使用します

    aws s3 ls s3:// your_bucket_name --recursive

さまざまな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());

バケット名を受け取り、そこに存在するオブジェクトをリストする、もう1つのシンプルなAPIが利用可能です。ObjectListingオブジェクト= s3client.listObjects(bucketName)javadocリンクを以下に示します。docs.aws.amazon.com/ AWSJavaSDK / latest / javadoc / com / amazonaws /…
Rajesh

2

素晴らしい"boto" libを使用してPythonでコードを記述します。このコードはバケット内のファイルのリストを返し、欠落しているバケットの例外も処理します。

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のエイリアス
  • kline:AWS S3バケット名

Minio Client Linuxの インストールmcをダウンロード:

$ chmod 755 mc
$ ./mc --help

Minio Clientを使用したAWS認証情報のセットアップ

$ mc config host add 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

JavaScriptで使用できます

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

バケット内のすべてのオブジェクトを取得します。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 2012年

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 2017

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/をダウンロードし、Web URLジェネレーターを使用して完全なリンクパスのリストを作成することです。それは非常に便利であり、約3クリックを含みます。

-Browse to Folder
-Select All
-Generate Urls

幸運を祈ります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.