我有一个亚马逊s3存储桶,其中包含数万个文件名。获取列出存储桶中所有文件名的文本文件的最简单方法是什么?
答案 0 :(得分:113)
我建议使用boto。然后快速couple of lines of 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
答案 1 :(得分:46)
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
这将显示您的所有文件。
答案 2 :(得分:42)
s3cmd对于此类事情非常宝贵
$ s3cmd ls -r s3://yourbucket/ | awk '{print $4}' > objects_in_bucket
答案 3 :(得分:32)
小心,亚马逊列表只返回1000个文件。如果要迭代所有文件,则必须使用标记对结果进行分页:
使用aws-s3
在ruby中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
答案 4 :(得分:13)
更新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
答案 5 :(得分: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))
}
要调用上面的curry 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 in Functional Programming 进行操作
答案 6 :(得分:7)
zach之后我也会推荐boto,但我需要对他的代码略有不同:
conn = boto.connect_s3('access-key', 'secret'key')
bucket = conn.lookup('bucket-name')
for key in bucket:
print key.name
答案 7 :(得分:7)
aws s3api list-objects --bucket bucket-name
有关详细信息,请参阅此处 - http://docs.aws.amazon.com/cli/latest/reference/s3api/list-objects.html
答案 8 :(得分:6)
首先请确保您使用的是instance terminal
中的all access
中的S3
中的IAM
。例如,我使用了一个ec2实例。
pip3 install awscli
然后配置AWS
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
在每个存储桶中存储文件结构
aws s3 ls bucket-name --recursive > file_Structure.txt
希望这会有所帮助。
答案 9 :(得分:5)
有几种方法可以解决它。 使用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
答案 10 :(得分:2)
在Java中,您可以使用ListObjects获取密钥(请参阅AWS documentation)
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());
答案 11 :(得分:2)
对于使用aws configure
之后的Python boto3:
import boto3
s3 = boto3.resource('s3')
bucket = s3.Bucket('name')
for obj in bucket.objects.all():
print(obj.key)
答案 12 :(得分:2)
以下命令将获取AWS S3存储桶中的所有文件名,并将其写入当前目录中的文本文件:
aws s3 ls s3://Bucketdirectory/Subdirectory/ | cat >> FileNames.txt
答案 13 :(得分:2)
python中的代码使用了很棒的"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() ]
不要忘记更换&lt; PLACE_HOLDERS&gt;与你的价值观。
答案 14 :(得分:1)
AWS CLI可以让您快速查看S3存储桶的所有文件,并帮助执行其他操作。
要使用AWS CLI,请执行以下步骤:
要查看S3存储桶的所有文件,请使用命令
aws s3 ls s3:// your_bucket_name-递归
针对不同的AWS服务使用AWS cli的参考:https://docs.aws.amazon.com/cli/latest/reference/
答案 15 :(得分:1)
这是一种使用库存 AWS CLI 生成仅包含对象名称的 contains
-able 列表的方法:
diff
(基于https://stackoverflow.com/a/54378943/53529)
这会为您提供存储桶中每个对象的完整对象名称,以新行分隔。例如,如果您想区分 S3 存储桶和 GCS 存储桶的内容,这将很有用。
答案 16 :(得分: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中使用。
答案 17 :(得分:1)
您可以使用标准s3 api -
aws s3 ls s3://root/folder1/folder2/
答案 18 :(得分: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;
}
答案 19 :(得分: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}'
答案 20 :(得分: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。
答案 21 :(得分:0)
在javascript中,您可以使用
s3.listObjects(params,function(err,result){});
将所有对象放入存储桶中。您必须在 params(存储桶:名称)中传递存储桶名称。
答案 22 :(得分:0)
或者您可以使用Minio Client aka 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
注意:
安装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
工作答案 23 :(得分:0)
使用铅条包裹cli,您将拥有清晰的语法:
import plumbum as pb
folders = pb.local['aws']('s3', 'ls')
答案 24 :(得分: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'];
}
您可以将上述代码的输出重定向到文件以获取密钥列表。
答案 25 :(得分: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}"
答案 26 :(得分:0)
我知道它的老话题,但是我也想贡献。
使用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"]
请记住,此解决方案不包含分页。
答案 27 :(得分: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));
}
答案 28 :(得分:-1)
这是一个老问题,但回复的数量告诉我很多人点击了这个页面。
我发现的最简单的方法是使用内置的 AWS console 来创建库存。设置很容易,但第一个 CSV 文件最多可能需要 48 小时才能显示。之后,您可以为您选择的存储桶创建每日或每周输出。
答案 29 :(得分:-3)
获取非常有用的文本文件的最简单方法是下载S3 Browser http://s3browser.com/并使用Web URL Generator生成完整链接路径列表。它非常方便,只需3次点击。
-Browse to Folder
-Select All
-Generate Urls
祝你好运。