列出Amazon S3存储桶中所有文件的快速方法?

Ste*_*eve 139 amazon-s3

我有一个亚马逊s3桶,里面有成千上万的文件名.获取列出存储桶中所有文件名的文本文件的最简单方法是什么?

Zac*_*zer 115

我建议使用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')
Run Code Online (Sandbox Code Playgroud)

将其保存为list.py,打开终端,然后运行:

$ python list.py > results.txt
Run Code Online (Sandbox Code Playgroud)

  • 如果得到:boto.exception.S3ResponseError:S3ResponseError:403 Forbidden确保Access/Secret密钥的用户策略可以访问S3. (3认同)
  • 你能用新的boto3包添加一个变种吗? (3认同)

Lay*_*yke 55

AWS CLI

aws s3 ls的文档

AWS最近发布了他们的命令行工具.这很像boto,可以使用sudo easy_install awscli或安装sudo pip install awscli

安装完成后,您就可以直接运行了

aws s3 ls
Run Code Online (Sandbox Code Playgroud)

这将向您展示所有可用的存储桶

CreationTime Bucket
       ------------ ------
2013-07-11 17:08:50 mybucket
2013-07-24 14:55:44 mybucket2
Run Code Online (Sandbox Code Playgroud)

然后,您可以在特定存储桶中查询文件.

命令:

aws s3 ls s3://mybucket
Run Code Online (Sandbox Code Playgroud)

输出:

Bucket: mybucket
Prefix:

      LastWriteTime     Length Name
      -------------     ------ ----
                           PRE somePrefix/
2013-07-25 17:06:27         88 test.txt
Run Code Online (Sandbox Code Playgroud)

这将显示您的所有文件.

  • 添加`--recursive`标志以查看指定目录下的所有对象 (11认同)
  • 有没有办法解析出名字?我希望在 s3 存储桶中创建一个文件列表以进行枚举。 (2认同)

mat*_*cey 42

s3cmd对于这种事情是非常宝贵的

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


vda*_*bry 34

小心,亚马逊列表只返回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
Run Code Online (Sandbox Code Playgroud)

结束

希望这会有所帮助,vincent

  • boto处理分页,请参阅https://github.com/boto/boto/blob/develop/boto/s3/bucket.py (7认同)

Kha*_*oui 17

更新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

  • 啊哈,但这并不难做到。只需在命令中添加“--recursive”即可。我会将其添加到我的答案中,感谢您指出这一点 (2认同)

Pao*_*tti 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))
}
Run Code Online (Sandbox Code Playgroud)

要调用上面的curried map()函数,只需在第一个参数列表中传递已构造的(并且已正确初始化的)AmazonS3Client对象(请参阅官方AWS SDK for Java API Reference),存储桶名称和前缀名称.同时传递f()要应用的函数以映射第二个参数列表中的每个对象摘要.

例如

val keyOwnerTuples = map(s3, bucket, prefix)(s => (s.getKey, s.getOwner))
Run Code Online (Sandbox Code Playgroud)

将返回该(key, owner)存储桶/前缀中的元组的完整列表

要么

map(s3, "bucket", "prefix")(s => println(s))
Run Code Online (Sandbox Code Playgroud)

正如Monads在函数式编程中通常所采用的那样


Dat*_*eek 7

在zach之后我也会推荐boto,但我需要对他的代码略有不同:

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

  • 修改是必要的,因为原始代码一次不起作用. (2认同)

sys*_*ser 7

aws s3api list-objects --bucket bucket-name
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅此处 - http://docs.aws.amazon.com/cli/latest/reference/s3api/list-objects.html


Mah*_*gal 7

有几种方法可以解决此问题。使用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)
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用AWS CLI

aws s3 ls s3://{bucketname}
example : aws s3 ls s3://testbucket133
Run Code Online (Sandbox Code Playgroud)


And*_*dré 6

对于 Python 的 boto3 使用后aws configure

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

bucket = s3.Bucket('name')
for obj in bucket.objects.all():
    print(obj.key)
Run Code Online (Sandbox Code Playgroud)


Har*_*_pb 6

首先要确认你是一个instance terminal和你all accessS3IAM你使用。例如我使用了一个 ec2 实例。

pip3 install awscli
Run Code Online (Sandbox Code Playgroud)

然后配置aws

aws configure
Run Code Online (Sandbox Code Playgroud)

然后填写 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)
Run Code Online (Sandbox Code Playgroud)

现在,查看所有存储桶

aws s3 ls
Run Code Online (Sandbox Code Playgroud)

存储所有存储桶名称

aws s3 ls > output.txt
Run Code Online (Sandbox Code Playgroud)

查看存储桶中的所有文件结构

aws s3 ls bucket-name --recursive
Run Code Online (Sandbox Code Playgroud)

在每个存储桶中存储文件结构

aws s3 ls bucket-name --recursive > file_Structure.txt
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。