如何知道S3存储桶中存储了多少个对象?


154

除非我没有丢失任何东西,否则看来我看过的所有API都不会告诉您S3存储桶/文件夹(前缀)中有多少个对象。有什么方法可以计数吗?


:这个问题可能会有所帮助stackoverflow.com/questions/701545/...
布伦丹·朗

1
解决方案在2015年确实存在:stackoverflow.com/a/32908591/578989
Mayank Jaiswal

请参阅下面的答案:stackoverflow.com/a/39111698/996926
advncd

Answers:


39

除非你没有办法

  1. 将它们全部以1000的批次列出(这可能很慢并且占用带宽-亚马逊似乎永远不会压缩XML响应),或者

  2. 在S3上登录到您的帐户,然后转到“帐户-使用情况”。帐单部门似乎确切知道您存储了多少个对象!

如果存储了5000万个对象,那么简单地下载所有对象的列表实际上将花费一些时间并花费一些钱。

另请参见关于StorageObjectCount的此线程 -在使用情况数据中。

一个S3 API至少能获得基础知识,即使它已经花了几个小时了,也还是不错的。


顺便说一句,那个联系已经死了。
字段


如果您像我一样懒惰,Newvem基本上会代表您执行此操作,并在您的S3帐户的每个存储桶级别汇总/跟踪结果。
rcoup 2012年

2
您能否更新您的回复以包含@MayankJaiswal的回复?
约瑟夫·凯西

1
计费部门知道一切!难怪他们有权力无意中
摧毁

255

使用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 Console

您可以查看cloudwatch的指标部分以获取大约存储的对象数。 在此处输入图片说明

我大约有五千万种产品,使用它花费了一个多小时 aws s3 ls


18
这应该更接近顶部。
约瑟夫·凯西

3
@JosephMCasey我同意。这也可以给具有桶的目录中的对象数量提供如下所示:aws s3 ls s3://mybucket/mydirectory/ --recursive | wc -l
蒂姆·彼得森

1
当我在cmd提示符下运行以上命令时出现此错误-无法将“ wc”识别为内部或外部命令,可操作程序或批处理文件。-我对此很陌生,所以有人可以提供解决方案吗?
Sandun '18

警告:CloudWatch似乎不太可靠。我在一个存储桶中有一个mp4文件,CloudWatch(NumberOfObjects指标)被视为2300个单独的对象。我通过AWS CLI获得了正确的号码。
AlexK

为什么选择“平均”?会有人不想要“ Sum”吗?
ffxsam

150

有一个--summarize开关,其中包含存储桶摘要信息 (即,对象数,总大小)。

这是使用AWS cli的正确答案:

aws s3 ls s3://bucketName/path/ --recursive --summarize | grep "Total Objects:"

Total Objects: 194273

请参阅说明文件


4
这很棒:Total Objects: 7235 Total Size: 475566411749-很简单。
bonh '17

16
不幸的是,仍然有列出数千个对象的主要开销(当前为600,000,因此非常耗时)
MichaelChirico

在具有5M个对象的存储桶上运行此任务需要多少费用?
Psychozoic

2
这个答案效率极低,可能非常缓慢且成本很高。遍历整个存储桶以找到答案。
韦弗

2
我可能还要补充一下,要迭代存储在标准存储中的超过12亿个对象,它的成本约为6000美元。
C约翰逊

66

尽管这是一个古老的问题,并在2015年提供了反馈,但现在它要简单得多,因为S3 Web Console启用了“获取大小”选项:

在此处输入图片说明

其中提供以下内容:

在此处输入图片说明


1
是的,新的AWS控制台虽然让我感到不舒服,但单击按钮后确实可以计算对象数和总大小。
阿妮

11
这似乎仅在文件夹级别起作用。“获取大小”不可用的桶水平
G-。

1
@G-。如果您选择存储桶的所有文件夹怎么办?
gvasquez

4
@G-。但是,“全选”框仅选择页面中显示的文件夹和对象,而不选择存储桶中的所有文件夹/对象。
gparis

2
@gparis好点。很值得一提。谢谢。因此,似乎在控制台中,如果文件或文件夹的数量超过单个页面
G-)

50

如果使用s3cmd命令行工具,则可以获取特定存储桶的递归列表,并将其输出到文本文件。

s3cmd ls -r s3://logs.mybucket/subfolder/ > listing.txt

然后在linux中,您可以在文件上运行wc -l来计算行数(每个对象1行)。

wc -l listing.txt

-r命令中的表示--recursive,因此它也适用于子文件夹。
Deepak Joy 2015年

关于此的3个注意事项。a。)应该使用aws s3 ls而不是s3cmd,因为它速度更快。b。)对于大桶,可能需要很长时间。处理1百万个文件大约需要5分钟。c。)请参阅下面有关使用Cloudwatch的答案。
mastaBlasta

46

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[])]"

1
Raphael,您的文件夹查询效果很好,除了当文件夹为空或不存在时,您会得到: 在函数length()中,值的无效类型:无,预期为:['string','array' ,'object'],收到:“ null” 如果文件夹为空或不退出,是否有办法使其输出为0?
user3591836

1
Illegal token value '(Contents[])]' 当使用--bucket my-bucketA client error (NoSuchBucket) occurred when calling the ListObjects operation: The specified bucket does not exist使用时,我得到(aws-cli的1.2.9版本)--bucket s3://my-bucket。(它确实存在,并且有1000多个文件。)
Darren Cook

@DarrenCook从存储桶名称中删除s3://。客户端似乎不支持该协议。
Sriranjan Manjunath

这比wc -l示例要快得多。使用我的存储桶,大约需要3-4k个对象/秒。因此,每百万个对象约5分钟。S3 Web GUI中的“获取大小”可能在幕后大致使用相同的时间。
notpeter

对于非常大的水桶,这是唯一的解决方案,从(不少于20分钟)为我工作在合理时间内
尼克Sarafa

39

您可以使用适用于s3的AWS cloudwatch指标来查看每个存储桶的确切计数。 选择存储桶时的cloudwatch指标


我认为这是最好的答案
Oktav

唯一真正的答案,而没有做一些荒谬的事情,例如列出1m +密钥。我忘了它在那里。
安德鲁·贝克

这需要更多的支持。其他所有解决方案在成本和时间方面的扩展性均很差。
亚伦·

5

转到AWS Billing,然后报告,然后是AWS Usage报告。选择Amazon Simple Storage Service,然后选择Operation StandardStorage。然后,您可以下载一个包含StorageObjectCount的UsageType的CSV文件,该文件列出了每个存储桶的项目计数。


4

您可以轻松获得总数和历史,如果你去到S3控制台“管理”选项卡,然后单击“度量” ...... 标签的屏幕截图


您可以更新图片以显示NumberOfObjects (count/day)图表吗?这样做会更好,因为它与问题直接相关。在您的屏幕快照中,您将显示BucketSizeBytes (bytes/day)哪个虽然有用,但与问题没有直接关系。
guzmonne

1
从2019年开始,这应该是公认的答案。所有其余的都过时或缓慢。
C约翰逊

2

该api将以1000为增量返回列表。检查IsTruncated属性以查看是否还有更多内容。如果有的话,您需要拨打另一个电话,并在下一个电话中传递您获得的最后一个键作为Marker属性。然后,您将继续像这样循环,直到IsTruncated为false。

有关更多信息,请参阅此Amazon文档:遍历多页结果


2

旧线程,但在我一直想找出答案之前,仍然很重要。我想使用基于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个文件,并且文件计数在不到一分钟的时间内完成了。


2

我使用了来自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。我在下面提出了一个建议,作为不同的答案。
Fuzzygroup

2

在s3cmd中,只需运行以下命令(在Ubuntu系统上):

s3cmd ls -r s3://mybucket | wc -l

13
您为什么要复活一个已有 5年历史的问题,以便发布现有答案的格式不正确的副本?
两位炼金术士

前一个答案不必要地将输出通过管道传输到txt文件中。
mjsa 2015年

10
海事组织,这应该是对该答案的评论。这确实是微不足道的区别。
两位炼金术士

2
似乎是一个有价值的答案-尤其是因为为此问题选择的答案以“没有办法...”开头,并且@mjsa提供了单行答案。

这不是一个好的答案,因为它没有考虑版本化的对象。
3h4x

2

如果您在Windows上使用AWS CLI,则可以使用Measure-Objectfrom PowerShell获取文件总数,就像wc -l在* nix上一样。

PS C:\> aws s3 ls s3://mybucket/ --recursive | Measure-Object

Count    : 25
Average  :
Sum      :
Maximum  :
Minimum  :
Property :

希望能帮助到你。


2

在s3中计算对象数量的最简单方法之一是:

步骤1:选择根文件夹步骤2:单击操作->删除(显然,请注意不要删除它)步骤3:等待几分钟,aws将显示对象数量及其总大小。

如果找到解决方案,则进行UpVote。


1

这些API都不会给您带来帮助,因为确实没有任何特定于Amazon的API可以做到这一点。您只需要运行一个目录内容并计算返回的结果数。


出于某种原因,ruby库(right_aws / appoxy_aws)列出的存储桶中的前1000个对象不会多于其他对象。还有其他人将列出所有对象吗?
字段

当您请求列表时,它们会提供一个“ NextToken”字段,您可以使用该字段再次发送带有令牌的请求,它将列出更多内容。
米奇·登普西

1

在AWS CLI的命令行中,使用ls plus --summarize。它将为您提供所有项目的列表以及特定存储桶中的文档总数。我尚未对包含子存储桶的存储桶尝试过此操作:

aws s3 ls "s3://MyBucket" --summarize

这花了一点时间(列出我的16 + K文档大约花了4分钟),但比一次计算1K要快。



0

3Hub已停产。有一个更好的解决方案,您可以使用“ 传输”(仅限Mac),然后只需连接到存储桶并Show Item CountView菜单中进行选择即可。


不幸的是,传输最多只能显示1000个项目(因此,项目数也最多显示1000个)
Tino

0

您可以从http://s3browser.com/下载并安装s3浏览器。当您在右上角选择存储桶时,您可以看到该存储桶中的文件数。但是,它显示的大小在当前版本中不正确。

广东商学院


0

最简单的方法是使用开发人员控制台,例如,如果您使用的是chrome,请选择“开发人员工具”,然后您会看到以下内容,您可以查找并计数或进行一些匹配,例如280-279 + 1 = 2

...


您能否添加一些有关如何使用开发人员工具计算存储桶中对象总数的详细信息。
Jugal Panchal

0

您可以潜在地使用Amazon S3库存,该清单将为您提供csv文件中的对象列表




0

您只需执行此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

0

如果您要查找特定文件(例如.jpg图像),则可以执行以下操作:

aws s3 ls s3://your_bucket | grep jpg | wc -l

0

以下是使用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;
    }
}

0

这是上面嵌入的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)`

0

aws s3 ls s3:// bucket-name / folder-prefix-if-any –递归| wc -l


它的确可以工作1000
多次,

这些行并不直接对应于文件数。因为它们还有一行用于日期和目录。
CMCDragonkai

该命令适用于有限数量的文件。以我为例,文件数量超过一百万,而且从未给出任何结果。但这是有限文件的不错选择。
Jugal Panchal
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.