快速列出所有文件在亚马逊 S3桶?

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

352833 次浏览

我建议使用 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

在 Zach 之后,我也会推荐 Boto,但是我需要对他的代码做一些细微的改变:

conn = boto.connect_s3('access-key', 'secret'key')
bucket = conn.lookup('bucket-name')
for key in bucket:
print key.name
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));


}

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

结束

希望这能帮上忙 Vincent

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

AWS CLI

aws s3 ls文档

AWS 最近发布了他们的命令行工具。这个工作原理很像 boto,可以使用 sudo easy_install awsclisudo 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

这会显示你所有的文件。

对于 Scala 开发人员来说,这里是一个递归函数,使用官方的 用于 Java 的 AWS SDK执行一个 全面扫描和映射,即 AmazonS3 bucket 的内容

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

要调用上面的 curry map()函数,只需在第一个参数列表中传递已经构建(并正确初始化)的 AmazonS3Client 对象(参见官方的 用于 JavaAPI 参考的 AWS SDK)、 bucket 名称和前缀名称。还要传递要应用的函数 f(),以映射第二个参数列表中的每个对象摘要。

比如说

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

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

或者

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

正如你通常靠近 函数式编程中的单子

使用令人敬畏的 “ 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 > 。

在 PHP 中,您可以使用以下调用获得特定 bucket 中的 AWS-S3对象的完整列表

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

您可以将上述代码的输出重定向到一个文件中,以获得密钥列表。

在 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());
aws s3api list-objects --bucket bucket-name

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

或者你也可以使用 Minio Client 也就是 mc。它的开放源码和兼容 AWS S3。Linux,Windows,Mac,FreeBSD.可以使用

您所要做的就是运行 MCs命令来列出内容。

$ 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 bucket 名

安装 Minio Client Linux 下载 mc for:

$ chmod 755 mc
$ ./mc --help

使用 Minio 客户端设置 AWS 凭据

$ mc config host add mys3 https://s3.amazonaws.com BKIKJAA5BMMU2RHO6IBB V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12

注意: 请将 mys3替换为您希望用于此帐户的别名以及 BKIKJAA5BMMU2RHO6IBB,V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12替换为您的 AWS 访问密钥和秘密密钥

希望能有帮助。

免责声明: 我为 米尼奥工作

您可以使用标准的 s3 api-

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

更新15-02-2019:

这个命令将为您提供 AWS S3中所有存储桶的列表:

aws s3 ls

这个命令将提供 AWS S3 bucket 中所有顶级对象的列表:

aws s3 ls bucket-name

这个命令将提供 AWS S3 bucket 中所有对象的列表:

aws s3 ls bucket-name --recursive

这个命令将把所有的列表放在一个 AWS s3 桶中... ... 放在你工作目录中的一个文本文件中:

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

您可以使用以下命令在 aws3 bucket 中列出所有文件

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 中工作。

由 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。

# 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}'

获得一个非常有用的文本文件的最简单的方法是下载 S3 Browser http://s3browser.com/并使用 Web URL Generator 生成一个完整链接路径列表。这是非常方便,并涉及约3点击。

-Browse to Folder
-Select All
-Generate Urls

祝你好运。

有几种方法可以做到这一点。 使用 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 s3桶中获取所有的文件名,然后写入你工作目录中的文本文件:

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

在 javascript 中,您可以使用

ListObjects (params,function (err,result){}) ;

为了得到桶中的所有对象。你必须在 Params (Bucket: name)中传递桶名。

对于使用 aws configure后的 Python boto3:

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


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

使用 plumbum 来包装 cli,你就会得到一个清晰的语法:

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

AWS CLI 可以让您快速查看 S3存储桶中的所有文件,并帮助您执行其他操作。

使用 AWS CLI 的步骤如下:

  1. 安装 AWS CLI。
  2. AWS CLI 配置为使用默认安全凭据和默认 AWS 区域。
  3. 要查看 S3 bucket 的所有文件,请使用命令

    Aws s3 ls s3://your _ bucket _ name ——

对不同 AWS 服务使用 AWS cli 的参考: https://docs.aws.amazon.com/cli/latest/reference/

请尝试这个 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}"

首先确保你是在一个 instance terminal和你有 all accessS3IAM你正在使用。例如,我使用了 ec2实例。

pip3 install awscli

然后配置奥斯

aws configure

然后填写证书,例如:-

$ 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

在每个 bucket 中存储文件结构

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

希望这个能帮上忙。

我知道它的老主题,但我也想贡献一份力量。

使用新版本的 boto3和 python,您可以得到以下文件:

import os
import boto3
from botocore.exceptions import ClientError


client = boto3.client('s3')


bucket = client.list_objects(Bucket=BUCKET_NAME)
for content in bucket["Contents"]:
key = content["key"]

请记住,这个解决方案并不理解分页。

更多信息: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Client.list_objects

下面是使用常用的 AWS CLI 生成一个 diff可用的对象名列表的方法:

aws s3api list-objects --bucket "$BUCKET" --query "Contents[].{Key: Key}" --output text

(基于 https://stackoverflow.com/a/54378943/53529)

这将为桶中的每个对象提供完整的对象名称,以新行分隔。例如,如果希望区分 S3 bucket 和 GCS bucket 的内容,则使用。

这是一个老问题,但回答的数量告诉我,许多人点击这一页。

我发现最简单的方法是使用内置的 AWS 控制台创建一个库存。这很容易设置,但第一个 CSV 文件可能需要长达48小时才能显示。之后,您可以创建一个每日或每周输出到您选择的桶。

为获得完整的链接运行

aws s3 ls s3://bucket/ | awk '{print $4}' | xargs -I{} echo "s3://bucket/{}"