如何知道我在 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-bucketA 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 存储桶中的所有对象设为公开?

列出具有公共读取权限的 S3 对象(在私有存储桶中)

如何使用 Java 列出存储桶中的所有 AWS S3 对象

如何强制删除 S3 存储桶中的所有对象版本,然后最终使用 aws-sdk-go 删除整个存储桶?

将对象保存在具有公共访问权限的 AWS S3 存储桶中