Bir S3 kovasında kaç tane nesne depoladığımı nasıl anlayabilirim?


164

Bir şeyi kaçırmıyorsam, baktığım API'lerin hiçbiri size bir <S3 bucket>/<folder>. Saymanın bir yolu var mı?



1
Çözüm 2015'te şimdi mevcut: stackoverflow.com/a/32908591/578989
Mayank Jaiswal

Aşağıdaki
cevabıma


Yanıtlar:


40

Hiçbir yolu yok, sen olmadıkça

  1. hepsini 1000'lik gruplar halinde listeleyin (bu yavaş olabilir ve bant genişliğini emebilir - Amazon XML yanıtlarını hiçbir zaman sıkıştırmıyor gibi görünüyor) veya

  2. S3'te hesabınıza giriş yapın ve Hesap - Kullanım bölümüne gidin. Görünüşe göre fatura departmanı tam olarak kaç nesne depoladığınızı biliyor!

Sadece tüm nesnelerinizin listesini indirmek aslında biraz zaman alacak ve depolanan 50 milyon nesneniz varsa biraz paraya mal olacaktır.

Ayrıca kullanım verilerinde yer alan StorageObjectCount hakkındaki bu iş parçacığına da bakın .

En azından temel bilgileri almak için bir S3 API, saatler eski olsa bile harika olurdu.


Bu arada, bu bağlantı öldü.
alanlar


Benim gibi tembelseniz , Newvem temelde bunu sizin adınıza yapar ve sonuçları S3 hesabınızda paket başına seviyede toplar / izler.
32'de rcoup

2
Yanıtınızı @ MayankJaiswal'ın yanıtını içerecek şekilde güncelleyebilir misiniz?
Joseph Casey

1
fatura departmanı her şeyi biliyor! s3 doğu kıyısını kazayla alt etme gücüne sahip olmalarına şaşmamalı
ski_squaw

268

AWS CLI'yi kullanma

aws s3 ls s3://mybucket/ --recursive | wc -l 

veya

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

Not: Yukarıdaki bulut izleme komutu, bazıları için değil, bazıları için işe yarıyor gibi görünüyor. Burada tartışıldı: https://forums.aws.amazon.com/thread.jspa?threadID=217050

AWS Web Konsolunu Kullanma

Depolanan yaklaşık sayıda nesneyi almak için cloudwatch'ın metrik bölümüne bakabilirsiniz . görüntü açıklamasını buraya girin

Yaklaşık 50 Milyon ürünüm var ve kullanarak saymak bir saatten fazla sürdü aws s3 ls


19
Bu tepeye daha yakın olmalı.
Joseph Casey

3
@JosephMCasey Katılıyorum. Bu aynı zamanda bir dizindeki nesnelerin sayısını şöyle bir kova ile verir:aws s3 ls s3://mybucket/mydirectory/ --recursive | wc -l
tim peterson

1
Yukarıdaki komutu cmd komut isteminde çalıştırdığımda bu hatayı veriyor - 'wc' dahili veya harici bir komut, çalıştırılabilir program veya toplu iş dosyası olarak tanınmıyor. - Bu konuda oldukça yeniyim, biri bir çözüm verebilir mi?
Sandun

CloudWatch'ın çok güvenilir görünmediğine dair bir uyarı. CloudWatch'ın (NumberOfObjects metriği) 2.300 ayrı nesne olarak saydığı bir pakette bir mp4 dosyam var. AWS CLI ile doğru numarayı aldım.
AlexK

Neden "Ortalama"? Birisi onun yerine "Sum" istemez mi?
ffxsam

159

Kova özet bilgilerini (yani nesnelerin sayısı, toplam boyut) --summarizeiçeren bir anahtar vardır .

İşte AWS cli kullanarak doğru yanıt:

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

Total Objects: 194273

Belgelere bakın


4
Bu harika: Total Objects: 7235 Total Size: 475566411749- çok kolay.
bonh

18
Hala binlerce nesneyi listelemenin büyük ek yüküne sahip, ne yazık ki (şu anda 600.000 artı, bu yüzden bu oldukça zaman alıyor)
MichaelChirico

1
Bu görevi paket üzerinde 5M nesnelerle çalıştırmanın maliyeti nedir?
Psychozoic

3
Bu cevap son derece verimsiz, potansiyel olarak çok yavaş ve maliyetlidir. Cevabı bulmak için tüm kovayı yineler.
weaver

3
Standart depolamada depolanan 1,2 milyardan fazla nesneyi yineleyerek, yaklaşık 6000 dolara mal olabileceğini ekleyebilir miyim?
C Johnson

70

Bu eski bir soru olmasına ve 2015 yılında geri bildirim sağlanmış olmasına rağmen, S3 Web Konsolu bir "Boyut Al" seçeneğini etkinleştirdiği için şu anda çok daha basit:

görüntü açıklamasını buraya girin

Aşağıdakileri sağlayan:

görüntü açıklamasını buraya girin


1
Evet, yeni AWS Konsolu gözlerimi incitse de, bir düğme tıklamasıyla Nesnelerin sayısını ve toplam boyutu hesaplamayı mümkün kılıyor.
Ani

13
Bu, yalnızca klasör düzeyinde çalışıyor gibi görünüyor. "Boyut al", kepçe düzeyinde kullanılamaz
G-.

1
@ G-. Ya tüm paket klasörlerini seçerseniz?
gvasquez

5
@ G-. Ancak "tümünü seç" kutusu, grubun tüm klasörlerini / nesnelerini değil, yalnızca sayfada gösterilen klasörleri ve nesneleri seçer.
gparis

2
@gparis iyi nokta. Kayda değer. Teşekkürler. Görünüşe göre, konsolda, tek bir sayfada görüntülenebilecek olandan daha fazla dosya veya klasör varsa bir seçeneğimiz yok
G-.

51

S3cmd komut satırı aracını kullanırsanız, belirli bir paketin özyinelemeli bir listesini alabilir ve bunu bir metin dosyasına çıkarabilirsiniz.

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

Daha sonra linux'ta satırları saymak için dosya üzerinde bir wc -l çalıştırabilirsiniz (nesne başına 1 satır).

wc -l listing.txt

-rKomuta içindir --recursivebuna da alt klasörler için çalışması gerektiğini, böylece.
Deepak Joy

Bununla ilgili 3 not. a.) aws s3 lss3cmd yerine kullanmalısınız çünkü daha hızlıdır. b.) Büyük kovalar için bu uzun zaman alabilir. 1mil dosyalar için yaklaşık 5 dakika sürdü. c.) Bulut gözlemciyi kullanma hakkında aşağıdaki cevabıma bakın.
mastaBlasta

48

Artık S3 API ile kolay bir çözüm var (AWS cli'da mevcuttur):

aws s3api list-objects --bucket BUCKETNAME --output json --query "[length(Contents[])]"

veya belirli bir klasör için:

aws s3api list-objects --bucket BUCKETNAME --prefix "folder/subfolder/" --output json --query "[length(Contents[])]"

1
Raphael, klasör sorgunuz harika çalışıyor, klasörün boş olduğu veya mevcut olmadığı durumlar dışında, şunu elde edersiniz: length () işlevinde, değer için geçersiz tür: Yok, beklenen biri: ['string', 'array' , 'nesne'], alındı: "null" Klasör boşsa veya çıkmıyorsa, yalnızca 0 çıktısını almanın bir yolu var mı?
user3591836

1
Illegal token value '(Contents[])]' Sadece kullanırken --bucket my-bucketve A client error (NoSuchBucket) occurred when calling the ListObjects operation: The specified bucket does not existkullanırken (aws-cli sürüm 1.2.9) alıyorum --bucket s3://my-bucket. (Kesinlikle var ve 1000'den fazla dosyası var.)
Darren Cook

@DarrenCook paket adından s3: // öğesini kaldırır. İstemci protokolü desteklemiyor gibi görünüyor.
Sriranjan Manjunath

Bu, wc -l örneklerinden çok daha hızlıdır. Kovalarımla kabaca 3-4 bin nesne / saniye sayılır. Yani milyon nesne başına ~ 5 dakika. S3 web GUI'sindeki "Get Size", aşağı yukarı aynı süreyi aldığından, muhtemelen kaputun altında benzer bir şey kullanır.
notpeter

İçin ÇOK büyük kepçelerle, bu (20 dakikadan az) makul bir süre içinde benim için çalıştı tek çözüm olduğunu
Nick sarafa

40

Her paketin tam sayısını görmek için s3 için AWS bulut gözlem ölçümlerini kullanabilirsiniz. paket seçtiğinizde bulut izleme metriği


Sanırım en iyi cevap bu
Oktav

1 milyondan fazla anahtar listelemek gibi saçma bir şey yapmadan tek gerçek cevap. Orada olduğunu unutmuşum.
Andrew Backer

Bunun daha fazla oylamaya ihtiyacı var. Diğer tüm çözümler, maliyet ve zaman açısından yetersiz ölçeklenir.
Aaron R.

5

AWS Billing'e, ardından raporlara, ardından AWS Kullanım raporlarına gidin. Amazon Simple Storage Service'i ve ardından Operation StandardStorage'ı seçin. Ardından, her paket için öğe sayısını listeleyen bir UsageType of StorageObjectCount içeren bir CSV dosyası indirebilirsiniz.


4

S3 konsolunun "Yönetim" sekmesine gidip "Metrikler" e tıklarsanız toplam sayımı ve geçmişi kolayca alabilirsiniz ... Sekmenin ekran görüntüsü


NumberOfObjects (count/day)grafiği göstermek için resmi güncelleyebilir misiniz ? Doğrudan soru ile ilgili olduğu için daha iyi olur. Ekran görüntünüzde, BucketSizeBytes (bytes/day)hangisinin yararlı olsa da doğrudan sorunla ilgili olmadığını gösteriyorsunuz .
guzmonne

1
2019 itibariyle, bu artık kabul edilen cevap olmalıdır. Geri kalan her şey modası geçmiş veya yavaş.
C Johnson

4

S3'teki nesnelerin sayısını saymanın en basit yollarından biri şudur:

Adım 1: Kök klasörü seçin

Adım 2: Eylemler -> Sil'e tıklayın ( açıkça, dikkatli olun - silmeyin)

Adım 3: Birkaç dakika bekleyin. Aws size nesne sayısını ve toplam boyutunu gösterecektir.


Güzel hack, ancak artık konsolda size nesnelerin sayısını da veren "Get Size" adlı bir eylem var.
Eli Algranti

3

Windows'ta AWS CLI kullanıyorsanız Measure-Object, tıpkı wc -l* nix'te olduğu gibi toplam dosya sayısını öğrenmek için PowerShell'den kullanabilirsiniz .

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

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

Umarım yardımcı olur.


2

API, listeyi 1000'lik artışlarla döndürür. Hala daha fazla olup olmadığını görmek için IsTruncated özelliğini kontrol edin. Varsa, başka bir arama yapmanız ve bir sonraki aramada Marker özelliği olarak aldığınız son anahtarı geçmeniz gerekir. Daha sonra IsTruncated yanlış olana kadar bu şekilde döngüye devam edersiniz.

Daha fazla bilgi için bu Amazon belgesine bakın: Çok Sayfalı Sonuçları Yineleme


2

Eski ipucu, ancak bunu çözene kadar cevabı aradığım için hala alakalı. GUI tabanlı bir araç kullanarak bir dosya sayımı istedim (yani kod yok). S3'e ve S3'ten sürükle ve bırak transferleri için zaten 3Hub adlı bir araç kullanıyorum. Belirli bir pakette kaç dosyam olduğunu bilmek istedim (faturalandırmanın onu gruplara ayırdığını sanmıyorum).

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  

Pakette 20521 dosya vardı ve dosya sayımını bir dakikadan daha kısa sürede tamamladım.


2

Scalablelogic.com'daki python betiğini kullandım (sayım günlüğünü ekleyerek). Harika çalıştı.

#!/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

Sadece farkında olun, bu boto3 ile çalışmıyor. Aşağıdaki öneriye farklı bir cevap olarak katkıda bulundum.
fuzzygroup

2

S3cmd'de, aşağıdaki komutu çalıştırın (bir Ubuntu sisteminde):

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

13
Mevcut bir cevabın kötü biçimlendirilmiş bir kopyasını göndermek için neden 5 yıllık bir soruyu diriltdiniz ?
Two-Bit Alchemist

Önceki yanıt, çıktıyı gereksiz yere bir txt dosyasına aktarıyordu.
mjsa

10
IMO, o zaman bu, bu cevaba ilişkin bir yorum olmalıdır. Bu gerçekten önemsiz bir fark.
Two-Bit Alchemist

2
Değerli bir cevap gibi görünüyor - özellikle bu soru için seçilen cevap 'İmkansız ...' ile başladığı ve @mjsa tek satırlık bir cevap verdiği için.
Nan

Bu iyi bir cevap değil çünkü versiyonlanmış nesneleri hesaba katmıyor.
3h4x

2

AWS CLI'deki komut satırından ls plus --summarize. Size tüm öğelerinizin listesini ve belirli bir paketteki toplam belge sayısını verecektir. Bunu alt kova içeren kovalarla denemedim:

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

Biraz uzun sürüyor (16 + K belgelerimi listelemek yaklaşık 4 dakika sürdü), ancak bir seferde 1K'yı saymaktan daha hızlı.


2

2020/10/22

AWS Console ile

AWS Cloudwatch'ın ölçümlerini kullanın

AWS CLI ile

Nesne sayısı:

veya:

aws s3api list-objects --bucket <BUCKET_NAME> --prefix "<FOLDER_NAME>" | wc -l

veya:

aws s3 ls s3://<BUCKET_NAME>/<FOLDER_NAME>/ --recursive --summarize --human-readable | grep "Total Objects"

veya s4cmd ile :

s4cmd ls -r s3://<BUCKET_NAME>/<FOLDER_NAME>/ | wc -l

Nesnelerin boyutu:

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

veya:

aws s3 ls s3://<BUCKET_NAME>/<FOLDER_NAME>/ --recursive --summarize --human-readable | grep "Total Size"

veya s4cmd ile :

s4cmd du s3://<BUCKET_NAME>

veya CloudWatch ölçümleriyle:

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"

1

API'lerin hiçbiri size bir sayı vermez çünkü bunu yapacak Amazon'a özgü herhangi bir API yoktur. Sadece bir liste içeriği çalıştırmanız ve döndürülen sonuçların sayısını saymanız gerekir.


Bazı nedenlerden dolayı, ruby ​​lib'leri (right_aws / appoxy_aws) bir kova içindeki ilk 1000 nesneden fazlasını listelemeyecektir. Tüm nesneleri listeleyen başkaları var mı?
alanlar

Listeyi talep ettiğinizde, bir "NextToken" alanı sağlarlar, bunu jetonla tekrar göndermek için kullanabileceğiniz ve daha fazlasını listeleyecektir.
Mitch Dempsey


1

İşte yukarıda gömülü python betiğinin boto3 sürümü.

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

1

aws s3 ls s3: // paket-adı / klasör-varsa-önek - tekrarlanan | wc -l


1000'den fazla işe
yarıyor

Satırlar doğrudan dosya sayısına karşılık gelmiyor. Çünkü sadece tarih ve dizin için tam bir satıra sahipler.
CMCDragonkai

Komut, sınırlı sayıda dosya için çalışır. Benim durumumda dosya sayısı bir milyondan fazla ve hiçbir sonuç vermiyor. Ancak sınırlı dosyalar için iyi bir seçenektir.
Jugal Panchal

0

3Hub kullanımdan kaldırıldı. Daha iyi bir çözüm var, biliyor kullanabilirsiniz İletim (yalnızca Mac), o zaman sadece kova bağlanıp tercih Show Item Countgelen Viewmenü.


İletim maalesef yalnızca 1000 öğeye kadar gösterir (ve bu nedenle Öğe Sayısı da 1000'de maksimuma çıkar)
Tino

0

S3 tarayıcısını http://s3browser.com/ adresinden indirip kurabilirsiniz . Sağ orta köşede bir kova seçtiğinizde, paketteki dosya sayısını görebilirsiniz. Ancak, gösterdiği boyut mevcut sürümde yanlış.

Gub'lar


0

En kolay yol, geliştirici konsolunu kullanmaktır; örneğin, Chrome kullanıyorsanız, Geliştirici Araçları'nı seçin ve aşağıdakileri görebilirsiniz, 280-279 + 1 = 2 gibi bir eşleşme bulabilir ve sayabilir veya bazı eşleşme yapabilirsiniz.

...


Bir paketteki toplam nesne sayısını bulmak için geliştirici araçlarını nasıl kullandığınıza dair biraz daha ayrıntı ekleyebilir misiniz?
Jugal Panchal

0

Bir csv dosyasındaki nesnelerin listesini verecek Amazon S3 envanterini potansiyel olarak kullanabilirsiniz




0

Paket veya belirli bir klasördeki toplam dosya sayısını elde etmek için bu cli komutunu çalıştırabilirsiniz.

Tüm paketi tara

aws s3api list-objects-v2 --bucket testbucket | grep "Key" | wc -l
aws s3api list-objects-v2 --bucket BUCKET_NAME | grep "Key" | wc -l

ayrıntılara girmek için bu komutu kullanabilirsiniz

aws s3api list-objects-v2 --bucket BUCKET_NAME

Belirli bir klasörü tara

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

Belirli dosyaları arıyorsanız, diyelim ki .jpgresimler, aşağıdakileri yapabilirsiniz:

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

0

Aşağıda, java istemcisini kullanarak bunu nasıl yapabileceğiniz anlatılmaktadır.

<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;
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.