如何知道我在 S3 存储桶中存储了多少对象?
Posted
技术标签:
【中文标题】如何知道我在 S3 存储桶中存储了多少对象?【英文标题】:How can I tell how many objects I've stored in an S3 bucket? 【发布时间】:2011-02-21 04:49:15 【问题描述】:除非我遗漏了什么,否则我所查看的任何 API 似乎都不会告诉您 <S3 bucket>/<folder>
中有多少对象。有什么方法可以统计吗?
【问题讨论】:
这个问题可能会有所帮助:***.com/questions/701545/… 解决方案确实存在于 2015 年:***.com/a/32908591/578989 在下面查看我的答案:***.com/a/39111698/996926 2017 答案:***.com/a/42927268/4875295 S3 存储类分析怎么样 - 您可以获得 API 以及控制台 - docs.aws.amazon.com/AmazonS3/latest/dev/… 【参考方案1】:使用 AWS CLI
aws s3 ls s3://mybucket/ --recursive | wc -l
或
aws cloudwatch get-metric-statistics \
--namespace AWS/S3 --metric-name NumberOfObjects \
--dimensions Name=BucketName,Value=BUCKETNAME \
Name=StorageType,Value=AllStorageTypes \
--start-time 2016-11-05T00:00 --end-time 2016-11-05T00:10 \
--period 60 --statistic Average
注意:上面的 cloudwatch 命令似乎对某些人有效,而对其他人无效。在这里讨论:https://forums.aws.amazon.com/thread.jspa?threadID=217050
使用 AWS Web 控制台
您可以查看cloudwatch's metric section 以获取大约存储的对象数量。
我有大约 5000 万种产品,使用 aws s3 ls
计算需要一个多小时
【讨论】:
这应该更靠近顶部。 @JosephMCasey 我同意。这也适用于使用这样的存储桶提供目录中的对象数量:aws s3 ls s3://mybucket/mydirectory/ --recursive | wc -l
当我在 cmd 提示符下运行上述命令时出现此错误 - 'wc' 未被识别为内部或外部命令、可运行程序或批处理文件。 - 我对此很陌生,所以有人可以提供解决方案吗?
警告 CloudWatch 似乎不太可靠。我在一个存储桶中有一个 mp4 文件,CloudWatch(NumberOfObjects 指标)计为 2,300 个单独的对象。我使用 AWS CLI 得到了正确的号码。
这对于计算目录中的对象数量也非常有用:ls dir | wc -l
【参考方案2】:
有一个 --summarize
开关,其中包括 存储桶摘要信息(即对象数、总大小)。
这是使用 AWS cli 的正确答案:
aws s3 ls s3://bucketName/path/ --recursive --summarize | grep "Total Objects:"
Total Objects: 194273
见documentation
【讨论】:
这很棒:Total Objects: 7235
Total Size: 475566411749
-- 很简单。
不幸的是,仍然有列出数千个对象的主要开销(目前超过 600,000 个,所以这非常耗时)
这个答案效率极低,可能非常缓慢且成本高昂。它遍历整个存储桶以找到答案。
我想补充一下,迭代存储在标准存储中的超过 12 亿个对象,可能需要花费大约 6000 美元。
er - 每 1000 个 LIST 请求 0.005 美元,每页结果为 1 个请求,cli 工具(和 API)默认并限制为 1000 个请求的结果。所以 (1200000000/1000/1000)*0.005) = 6 美元。当然,其他存储层每 1k 个请求的成本更高。 AFAIK 收费不是按搜索/返回的对象收费,而是按实际 API 请求收费。【参考方案3】:
虽然这是一个老问题,并且在 2015 年提供了反馈,但现在它要简单得多,因为 S3 Web 控制台已启用“获取大小”选项:
提供以下内容:
【讨论】:
是的,新的 AWS 控制台虽然让我的眼睛受伤,但确实可以通过单击按钮计算对象的数量和总大小。 这似乎只适用于文件夹级别。 “获取大小”在存储桶级别不可用 @G-。如果选择存储桶的所有文件夹会怎样? @G-。但是,“全选”框只选择页面中显示的文件夹和对象,而不是存储桶的所有文件夹/对象。 @gparis 好点。非常值得注意。谢谢。因此,在控制台中,如果文件或文件夹的数量超过单个页面上可以显示的数量,我们似乎没有选项【参考方案4】:现在有一个简单的 S3 API 解决方案(在 AWS cli 中可用):
aws s3api list-objects --bucket BUCKETNAME --output json --query "[length(Contents[])]"
或针对特定文件夹:
aws s3api list-objects --bucket BUCKETNAME --prefix "folder/subfolder/" --output json --query "[length(Contents[])]"
【讨论】:
Raphael,您的文件夹查询效果很好,除非文件夹为空或不存在,然后您会得到:在函数长度()中,值的无效类型:无,预期之一:['string', 'array', 'object'], received: "null" 如果文件夹为空或不退出,有没有办法让它输出 0? 我得到Illegal token value '(Contents[])]'
(aws-cli 的 1.2.9 版),仅使用 --bucket my-bucket
和 A client error (NoSuchBucket) occurred when calling the ListObjects operation: The specified bucket does not exist
时使用 --bucket s3://my-bucket
。 (它肯定存在,并且有 1000 多个文件。)
@DarrenCook 从存储桶名称中删除 s3://。客户端似乎不支持该协议。
对于 非常 个大桶,这是在合理时间内(不到 20 分钟)对我有用的唯一解决方案
这很有趣,值得注意的是,即使认为s3api list-objects
命令应该将自身限制为 1000 页大小,但当您执行此查询时,此限制无效。发出多个调用并返回对象总数。【参考方案5】:
如果您使用s3cmd 命令行工具,您可以获得特定存储桶的递归列表,并将其输出到文本文件。
s3cmd ls -r s3://logs.mybucket/subfolder/ > listing.txt
然后在 linux 中,您可以在文件上运行 wc -l 来计算行数(每个对象 1 行)。
wc -l listing.txt
【讨论】:
命令中的-r
是--recursive
,所以它也应该适用于子文件夹。
对此有 3 条注释。 a.) 你应该使用 aws s3 ls
而不是 s3cmd 因为它更快。 b.) 对于大桶,可能需要很长时间。 100万个文件大约需要5分钟。 c.) 请参阅下面关于使用 cloudwatch 的回答。
你可以用pip install s3cmd
安装s3cmd【参考方案6】:
没有办法,除非你
以 1000 个为一组列出它们(这可能会很慢并且会占用带宽 - 亚马逊似乎从不压缩 XML 响应),或者
在 S3 上登录您的帐户,然后转到帐户 - 使用情况。看来计费部门确切地知道您存储了多少对象!
如果您存储了 5000 万个对象,则仅下载所有对象的列表实际上会花费一些时间和成本。
另见this thread about StorageObjectCount - 在使用数据中。
一个 S3 API 至少可以获得基础知识,即使它是几个小时前的,也会很棒。
【讨论】:
顺便说一句,那个链接已经失效了。 对不起:developer.amazonwebservices.com/connect/… 如果您像我一样懒惰,Newvem 基本上代表您执行此操作,并在您的 S3 帐户中按存储桶级别聚合/跟踪结果。 您能否更新您的回复以包含@MayankJaiswal 的回复? 计费部门知道一切!难怪他们有能力意外拿下 s3 东海岸【参考方案7】:您可以使用 s3 的 AWS cloudwatch 指标来查看每个存储桶的准确计数。
【讨论】:
我认为这是最好的答案 唯一真正的答案,没有做一些荒谬的事情,比如列出 1m+ 个键。我忘了它在那里。 这需要更多的支持。在成本和时间方面,其他所有解决方案的扩展性都很差。 但是,请注意“此值是通过计算存储桶中的所有对象(当前和非当前对象)以及所有未完成的分段上传到存储桶的部分总数来计算的。”所以它也会计算旧版本。【参考方案8】:2020/10/22
使用 AWS 控制台
使用 AWS Cloudwatch 的指标
使用 AWS CLI
对象数:
或:
aws s3api list-objects --bucket <BUCKET_NAME> --prefix "<FOLDER_NAME>" | wc -l
或:
aws s3 ls s3://<BUCKET_NAME>/<FOLDER_NAME>/ --recursive --summarize --human-readable | grep "Total Objects"
或s4cmd:
s4cmd ls -r s3://<BUCKET_NAME>/<FOLDER_NAME>/ | wc -l
对象大小:
aws s3api list-objects --bucket <BUCKET_NAME> --output json --query "[sum(Contents[].Size), length(Contents[])]" | awk 'NR!=2 print $0;next NR==2 print $0/1024/1024/1024" GB"'
或:
aws s3 ls s3://<BUCKET_NAME>/<FOLDER_NAME>/ --recursive --summarize --human-readable | grep "Total Size"
或s4cmd:
s4cmd du s3://<BUCKET_NAME>
或使用 CloudWatch 指标:
aws cloudwatch get-metric-statistics --metric-name BucketSizeBytes --namespace AWS/S3 --start-time 2020-10-20T16:00:00Z --end-time 2020-10-22T17:00:00Z --period 3600 --statistics Average --unit Bytes --dimensions Name=BucketName,Value=<BUCKET_NAME> Name=StorageType,Value=StandardStorage --output json | grep "Average"
【讨论】:
对于对象的数量,aws s3 ls
解决方案对我来说效果很好,但之前的解决方案返回的数字要高得多,因为aws s3api list-objects
返回的每个对象都表示为一个跨越 10 的 JSON 对象线。作为记录,我使用的是 aws-cli 2.3.2【参考方案9】:
转到 AWS 账单,然后是报告,然后是 AWS 使用情况报告。 选择 Amazon Simple Storage Service,然后选择 Operation StandardStorage。 然后,您可以下载一个 CSV 文件,其中包含 StorageObjectCount 的 UsageType,其中列出了每个存储桶的项目计数。
【讨论】:
【参考方案10】:如果您在 Windows 上使用 AWS CLI,则可以使用 PowerShell 中的 Measure-Object
来获取文件总数,就像 *nix 上的 wc -l
。
PS C:\> aws s3 ls s3://mybucket/ --recursive | Measure-Object
Count : 25
Average :
Sum :
Maximum :
Minimum :
Property :
希望对你有帮助。
【讨论】:
【参考方案11】:在 s3cmd 中,只需运行以下命令(在 Ubuntu 系统上):
s3cmd ls -r s3://mybucket | wc -l
【讨论】:
你为什么要复活一个 5 年前的问题来发布格式不正确的 an existing answer 副本? 上一个答案不必要地将输出通过管道传输到 txt 文件中。 IMO 这应该是对该答案的评论。这是一个非常微不足道的区别。 似乎是一个有价值的答案 - 特别是因为这个问题的选定答案以“没有办法......”开头并且@mjsa 提供了一个单行答案。 这不是一个好的答案,因为它没有考虑版本化对象。【参考方案12】:在 AWS CLI 的命令行中,使用 ls plus --summarize
。它将为您提供所有项目的列表以及特定存储桶中的文档总数。我没有尝试过包含子桶的桶:
aws s3 ls "s3://MyBucket" --summarize
这需要花费一些时间(列出我的 16+K 文档大约需要 4 分钟),但它比一次计算 1K 更快。
【讨论】:
【参考方案13】:如果您转到 s3 控制台“管理”选项卡,然后单击“指标”,您可以轻松获取总数和历史记录...Screen shot of the tab
【讨论】:
能否更新图片以显示NumberOfObjects (count/day)
图表?这会更好,因为它与问题直接相关。在您的屏幕截图中,您显示的是 BucketSizeBytes (bytes/day)
,虽然有用,但与问题没有直接关系。
截至 2019 年,这现在应该是公认的答案。其余的都已过时或缓慢。【参考方案14】:
计算 s3 中对象数量的最简单方法之一是:
第一步:选择根目录
第 2 步:点击操作 -> 删除(显然,小心 - 不要删除它)
第 3 步:等待几分钟 aws 会显示对象的数量及其总大小。
【讨论】:
不错的 hack,但现在控制台中有一个名为“获取大小”的操作,它还可以为您提供对象的数量。 @EliAlgranti 这个选项到底在哪里?它是显示文件的数量,还是以 kbs 为单位的总大小?【参考方案15】:自 2020 年 11 月 18 日起,现在有一种更简单的方法来获取此信息,而无需对您的 API 请求征税:
AWS S3 Storage Lens
默认的内置免费仪表板可让您在“存储桶”标签下查看所有存储桶或单个存储桶的计数。有许多下拉菜单可以过滤和排序几乎任何您想要的合理指标。
【讨论】:
这个有命令行选项吗?【参考方案16】:没有任何 API 会给您计数,因为实际上没有任何 Amazon 特定的 API 可以做到这一点。您只需运行 list-contents 并计算返回的结果数。
【讨论】:
出于某种原因,ruby 库 (right_aws/appoxy_aws) 不会列出超过存储桶中的前 1000 个对象。还有其他的会列出所有对象吗? 当您请求列表时,他们提供了一个“NextToken”字段,您可以使用该字段再次发送带有令牌的请求,它会列出更多。【参考方案17】:api 将以 1000 为增量返回列表。检查 IsTruncated 属性以查看是否还有更多。如果有,您需要再次调用并在下一次调用时将您获得的最后一个键作为 Marker 属性传递。然后你会继续这样循环,直到 IsTruncated 为假。
有关更多信息,请参阅此亚马逊文档:Iterating Through Multi-Page Results
【讨论】:
【参考方案18】:旧线程,但仍然相关,因为我一直在寻找答案,直到我弄清楚这一点。我想要使用基于 GUI 的工具(即无代码)的文件计数。我碰巧已经使用了一个名为 3Hub 的工具来进行与 S3 之间的拖放传输。我想知道我有多少文件在一个特定的存储桶中(我不认为计费会按存储桶划分)。
So, using 3Hub,
- list the contents of the bucket (looks basically like a finder or explorer window)
- go to the bottom of the list, click 'show all'
- select all (ctrl+a)
- choose copy URLs from right-click menu
- paste the list into a text file (I use TextWrangler for Mac)
- look at the line count
我的存储桶中有 20521 个文件,不到一分钟就完成了文件计数。
【讨论】:
【参考方案19】:我使用了来自scalablelogic.com 的python 脚本(添加了计数日志)。效果很好。
#!/usr/local/bin/python
import sys
from boto.s3.connection import S3Connection
s3bucket = S3Connection().get_bucket(sys.argv[1])
size = 0
totalCount = 0
for key in s3bucket.list():
totalCount += 1
size += key.size
print 'total size:'
print "%.3f GB" % (size*1.0/1024/1024/1024)
print 'total count:'
print totalCount
【讨论】:
请注意,这不适用于 boto3。我在下面提供了一个建议作为不同的答案。【参考方案20】:2021 答案
此信息现在显示在 AWS 控制面板中。只需导航到存储桶并单击“指标”选项卡。
【讨论】:
【参考方案21】:这是上面嵌入的python脚本的boto3版本。
import sys
import boto3
s3 = boto3.resource('s3')
s3bucket = s3.Bucket(sys.argv[1])
size = 0
totalCount = 0
for key in s3bucket.objects.all():
totalCount += 1
size += key.size
print('total size:')
print("%.3f GB" % (size*1.0/1024/1024/1024))
print('total count:')
print(totalCount)`
【讨论】:
【参考方案22】:aws s3 ls s3://bucket-name/folder-prefix-if-any --recursive | wc -l
【讨论】:
它确实适用于超过 1000 个它对我来说是 4258 个 这些行不直接对应于文件数。因为他们也有一整行只是日期和目录。 该命令适用于有限数量的文件。在我的情况下,文件数量超过一百万,它永远不会给出任何结果。但对于有限的文件来说,这是一个不错的选择。【参考方案23】:选择存储桶/文件夹->点击操作->点击计算总大小
【讨论】:
【参考方案24】:3Hub 已停产。有一个更好的解决方案,您可以使用Transmit(仅限Mac),然后您只需连接到您的存储桶并从View
菜单中选择Show Item Count
。
【讨论】:
不幸的是,Transmit 最多只显示 1000 个项目(因此项目计数也达到了 1000 个)【参考方案25】:您可以从http://s3browser.com/ 下载并安装s3 浏览器。当您选择右上角的存储桶时,您可以看到存储桶中的文件数量。但是,它显示的大小在当前版本中是不正确的。
Gubs
【讨论】:
【参考方案26】:您可能会使用 Amazon S3 清单,该清单将为您提供 csv 文件中的对象列表
【讨论】:
【参考方案27】:也可以使用gsutil du
(是的,Google Cloud 工具)完成
gsutil du s3://mybucket/ | wc -l
【讨论】:
【参考方案28】:您只需执行此 cli 命令即可获取存储桶或特定文件夹中的文件总数
扫描整个存储桶
aws s3api list-objects-v2 --bucket testbucket | grep "Key" | wc -l
aws s3api list-objects-v2 --bucket BUCKET_NAME | grep "Key" | wc -l
您可以使用此命令获取详细信息
aws s3api list-objects-v2 --bucket BUCKET_NAME
扫描特定文件夹
aws s3api list-objects-v2 --bucket testbucket --prefix testfolder --start-after testfolder/ | grep "Key" | wc -l
aws s3api list-objects-v2 --bucket BUCKET_NAME --prefix FOLDER_NAME --start-after FOLDER_NAME/ | grep "Key" | wc -l
【讨论】:
【参考方案29】:如果您要查找特定文件,比如.jpg
图像,您可以执行以下操作:
aws s3 ls s3://your_bucket | grep jpg | wc -l
【讨论】:
【参考方案30】:以下是使用 java 客户端的方法。
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-s3</artifactId>
<version>1.11.519</version>
</dependency>
import com.amazonaws.ClientConfiguration;
import com.amazonaws.Protocol;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.ObjectListing;
public class AmazonS3Service
private static final String S3_ACCESS_KEY_ID = "ACCESS_KEY";
private static final String S3_SECRET_KEY = "SECRET_KEY";
private static final String S3_ENDPOINT = "S3_URL";
private AmazonS3 amazonS3;
public AmazonS3Service()
ClientConfiguration clientConfiguration = new ClientConfiguration();
clientConfiguration.setProtocol(Protocol.HTTPS);
clientConfiguration.setSignerOverride("S3SignerType");
BasicAWSCredentials credentials = new BasicAWSCredentials(S3_ACCESS_KEY_ID, S3_SECRET_KEY);
AWSStaticCredentialsProvider credentialsProvider = new AWSStaticCredentialsProvider(credentials);
AmazonS3ClientBuilder.EndpointConfiguration endpointConfiguration = new AmazonS3ClientBuilder.EndpointConfiguration(S3_ENDPOINT, null);
amazonS3 = AmazonS3ClientBuilder.standard().withCredentials(credentialsProvider).withClientConfiguration(clientConfiguration)
.withPathStyleAccessEnabled(true).withEndpointConfiguration(endpointConfiguration).build();
public int countObjects(String bucketName)
int count = 0;
ObjectListing objectListing = amazonS3.listObjects(bucketName);
int currentBatchCount = objectListing.getObjectSummaries().size();
while (currentBatchCount != 0)
count += currentBatchCount;
objectListing = amazonS3.listNextBatchOfObjects(objectListing);
currentBatchCount = objectListing.getObjectSummaries().size();
return count;
【讨论】:
以上是关于如何知道我在 S3 存储桶中存储了多少对象?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我可以在未经许可的情况下删除/列出 S3 存储桶中的对象
默认情况下,如何将 AWS S3 存储桶中的所有对象设为公开?