Bir şeyi kaçırmıyorsam, baktığım API'lerin hiçbiri size bir <S3 bucket>/<folder>
. Saymanın bir yolu var mı?
Bir şeyi kaçırmıyorsam, baktığım API'lerin hiçbiri size bir <S3 bucket>/<folder>
. Saymanın bir yolu var mı?
Yanıtlar:
Hiçbir yolu yok, sen olmadıkça
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
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.
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
Depolanan yaklaşık sayıda nesneyi almak için cloudwatch'ın metrik bölümüne bakabilirsiniz .
Yaklaşık 50 Milyon ürünüm var ve kullanarak saymak bir saatten fazla sürdü aws s3 ls
aws s3 ls s3://mybucket/mydirectory/ --recursive | wc -l
Kova özet bilgilerini (yani nesnelerin sayısı, toplam boyut) --summarize
iç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
Total Objects: 7235
Total Size: 475566411749
- çok kolay.
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
-r
Komuta içindir --recursive
buna da alt klasörler için çalışması gerektiğini, böylece.
aws s3 ls
s3cmd 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.
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[])]"
Illegal token value '(Contents[])]'
Sadece kullanırken --bucket my-bucket
ve A client error (NoSuchBucket) occurred when calling the ListObjects operation: The specified bucket does not exist
kullanırken (aws-cli sürüm 1.2.9) alıyorum --bucket s3://my-bucket
. (Kesinlikle var ve 1000'den fazla dosyası var.)
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 .
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.
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.
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
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.
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
S3cmd'de, aşağıdaki komutu çalıştırın (bir Ubuntu sisteminde):
s3cmd ls -r s3://mybucket | wc -l
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ı.
AWS Cloudwatch'ın ölçümlerini kullanın
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
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"
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.
S3 depolama sınıfı analitiğine ne dersiniz - Konsolda olduğu gibi API'leri de alırsınız - https://docs.aws.amazon.com/AmazonS3/latest/dev/analytics-storage-class.html
İş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)`
aws s3 ls s3: // paket-adı / klasör-varsa-önek - tekrarlanan | wc -l
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
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.
...
S3 tarayıcı aracını çok kullanıcı buldum, dosyalar ve klasörler ve toplam sayımın yanı sıra herhangi bir klasör için özyinelemeli olarak boyut sağlar
İndirme bağlantısı: https://s3browser.com/download.aspx
gsutil du
(Evet, bir Google Cloud aracı) ile de yapılabilir
gsutil du s3://mybucket/ | wc -l
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
Belirli dosyaları arıyorsanız, diyelim ki .jpg
resimler, aşağıdakileri yapabilirsiniz:
aws s3 ls s3://your_bucket | grep jpg | wc -l
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;
}
}