O ile czegoś nie brakuje, wydaje się, że żaden z interfejsów API, które oglądałem, nie powie Ci, ile obiektów znajduje się w zasobniku / folderze S3 (prefiks). Czy jest jakiś sposób, aby policzyć?
O ile czegoś nie brakuje, wydaje się, że żaden z interfejsów API, które oglądałem, nie powie Ci, ile obiektów znajduje się w zasobniku / folderze S3 (prefiks). Czy jest jakiś sposób, aby policzyć?
Odpowiedzi:
Nie ma sposobu, chyba że ty
wymień je wszystkie w partiach po 1000 (co może być wolne i obciążać pasmo - amazon wydaje się nigdy nie kompresować odpowiedzi XML), lub
zaloguj się na swoje konto na S3 i przejdź do Konto - Użytkowanie. Wygląda na to, że dział rozliczeń dokładnie wie, ile obiektów przechowujesz!
Samo pobranie listy wszystkich obiektów zajmie trochę czasu i będzie kosztować trochę pieniędzy, jeśli przechowujesz 50 milionów obiektów.
Zobacz także ten wątek dotyczący StorageObjectCount - który znajduje się w danych użycia.
Interfejs API S3, aby uzyskać przynajmniej podstawy, nawet jeśli miał kilka godzin, byłby świetny.
aws s3 ls s3://mybucket/ --recursive | wc -l
lub
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
Uwaga: powyższe polecenie Cloudwatch wydaje się działać dla niektórych, a nie dla innych. Omówiono tutaj: https://forums.aws.amazon.com/thread.jspa?threadID=217050
Możesz spojrzeć na sekcję metryczną Cloudwatch, aby uzyskać przybliżoną liczbę przechowywanych obiektów.
Mam około 50 milionów produktów, a ich liczenie zajęło ponad godzinę aws s3 ls
aws s3 ls s3://mybucket/mydirectory/ --recursive | wc -l
Jest --summarize
przełącznik, który zawiera podsumowanie informacji o zasobniku (np. Liczba obiektów, całkowity rozmiar).
Oto poprawna odpowiedź przy użyciu AWS CLI:
aws s3 ls s3://bucketName/path/ --recursive --summarize | grep "Total Objects:"
Total Objects: 194273
Zobacz dokumentację
Total Objects: 7235
Total Size: 475566411749
- takie proste.
Chociaż jest to stare pytanie, a opinie otrzymano w 2015 r., Obecnie jest to znacznie prostsze, ponieważ konsola internetowa S3 ma włączoną opcję „Pobierz rozmiar”:
Który zapewnia:
Jeśli używasz narzędzia wiersza poleceń s3cmd , możesz uzyskać rekurencyjną listę określonego zasobnika, wyprowadzając ją do pliku tekstowego.
s3cmd ls -r s3://logs.mybucket/subfolder/ > listing.txt
Następnie w Linuksie możesz uruchomić wc -l na pliku, aby policzyć linie (1 linia na obiekt).
wc -l listing.txt
-r
W poleceniu jest --recursive
, więc powinien działać dla podfolderów, jak również.
aws s3 ls
zamiast s3cmd, ponieważ jest szybszy. b.) W przypadku dużych łyżek może to zająć dużo czasu. Zajęło około 5 minut na 1 miliony plików. c.) Zobacz moją odpowiedź poniżej na temat korzystania z chmury.
Istnieje teraz proste rozwiązanie z interfejsem API S3 (dostępne w kliencie AWS):
aws s3api list-objects --bucket BUCKETNAME --output json --query "[length(Contents[])]"
lub dla konkretnego folderu:
aws s3api list-objects --bucket BUCKETNAME --prefix "folder/subfolder/" --output json --query "[length(Contents[])]"
Illegal token value '(Contents[])]'
(wersja 1.2.9 aws-cli), gdy tylko używam --bucket my-bucket
i A client error (NoSuchBucket) occurred when calling the ListObjects operation: The specified bucket does not exist
kiedy używam --bucket s3://my-bucket
. (Zdecydowanie istnieje i ma ponad 1000 plików.)
Przejdź do AWS Billing, następnie raporty, a następnie AWS Usage reports. Wybierz Amazon Simple Storage Service, a następnie Operation StandardStorage. Następnie możesz pobrać plik CSV zawierający UsageType o wartości StorageObjectCount, który zawiera liczbę elementów dla każdego segmentu.
Możesz łatwo uzyskać łączną liczbę i historię, przechodząc do zakładki "Zarządzanie" konsoli s3, a następnie klikając "Metryki" ... Zrzut ekranu zakładki
NumberOfObjects (count/day)
wykres? Byłoby lepiej, ponieważ jest to bezpośrednio związane z pytaniem. Na zrzucie ekranu pokazujesz, BucketSizeBytes (bytes/day)
które, choć przydatne, nie są bezpośrednio związane z problemem.
Interfejs API zwróci listę w przyrostach co 1000. Sprawdź właściwość IsTruncated, aby zobaczyć, czy jest ich jeszcze więcej. Jeśli tak, musisz wykonać kolejne połączenie i przekazać ostatni otrzymany klucz jako właściwość Marker podczas następnego połączenia. Następnie kontynuowałbyś pętlę w ten sposób, aż IsTruncated ma wartość false.
Zobacz ten dokument Amazon, aby uzyskać więcej informacji: Iteracja wyników wielostronicowych
Stary wątek, ale nadal aktualny, ponieważ szukałem odpowiedzi, dopóki tego nie zrozumiałem. Chciałem policzyć pliki przy użyciu narzędzia opartego na GUI (tj. Bez kodu). Tak się składa, że używam już narzędzia o nazwie 3Hub do przenoszenia danych metodą przeciągnij i upuść do iz S3. Chciałem wiedzieć, ile plików mam w konkretnym segmencie (nie sądzę, że rozliczenie rozkłada to na segmenty).
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
Miałem 20521 plików w zasobniku i policzyłem pliki w mniej niż minutę.
Użyłem skryptu w języku Python ze strony scalablelogic.com (dodając rejestrację liczby). Działało świetnie.
#!/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
W s3cmd po prostu uruchom następujące polecenie (w systemie Ubuntu):
s3cmd ls -r s3://mybucket | wc -l
Jeśli używasz interfejsu wiersza polecenia AWS w systemie Windows, możesz użyć programu Measure-Object
PowerShell, aby uzyskać całkowitą liczbę plików, tak jak wc -l
w * nix.
PS C:\> aws s3 ls s3://mybucket/ --recursive | Measure-Object
Count : 25
Average :
Sum :
Maximum :
Minimum :
Property :
Mam nadzieję, że to pomoże.
Jednym z najprostszych sposobów zliczania liczby obiektów w s3 jest:
Krok 1: Wybierz folder główny Krok 2: Kliknij Akcje -> Usuń (oczywiście uważaj, nie usuwaj go) Krok 3: Poczekaj kilka minut, a pokaże Ci liczbę obiektów i ich całkowity rozmiar.
Głosuj w górę, jeśli znajdziesz rozwiązanie.
Żaden z interfejsów API nie da ci liczby, ponieważ tak naprawdę nie ma żadnego interfejsu API Amazon, który mógłby to zrobić. Musisz po prostu uruchomić zawartość listy i policzyć liczbę wyników, które zostaną zwrócone.
Z wiersza poleceń w AWS CLI użyj ls plus --summarize
. To da ci listę wszystkich twoich przedmiotów i całkowitą liczbę dokumentów w określonym segmencie. Nie próbowałem tego z zasobnikami zawierającymi zasobniki podrzędne:
aws s3 ls "s3://MyBucket" --summarize
Zajmuje to trochę czasu (wymienienie moich dokumentów 16 + K zajęło około 4 minut), ale jest szybsze niż liczenie 1K na raz.
A co z analizą klasy pamięci masowej S3 - Otrzymujesz interfejsy API, a także na konsoli - https://docs.aws.amazon.com/AmazonS3/latest/dev/analytics-storage-class.html
Możesz pobrać i zainstalować przeglądarkę s3 ze strony http://s3browser.com/ . Po wybraniu zasobnika w prawym środkowym rogu możesz zobaczyć liczbę plików w zasobniku. Ale rozmiar, który pokazuje, jest nieprawidłowy w bieżącej wersji.
Gubs
Najłatwiej jest użyć konsoli programisty, na przykład jeśli korzystasz z Chrome, wybierz Narzędzia programistyczne i możesz zobaczyć następujące, możesz albo znaleźć i policzyć lub wykonać jakieś dopasowanie, na przykład 280-279 + 1 = 2
...
Uważam, że narzędzie przeglądarki S3 jest bardzo użytkownika, zapewnia rekursywnie pliki i foldery oraz całkowitą liczbę i rozmiar dowolnego folderu
Link do pobrania: https://s3browser.com/download.aspx
Można to również zrobić za pomocą gsutil du
(Tak, narzędzie Google Cloud)
gsutil du s3://mybucket/ | wc -l
Możesz po prostu wykonać to polecenie cli, aby uzyskać całkowitą liczbę plików w zasobniku lub określonym folderze
Skanuj całe wiadro
aws s3api list-objects-v2 --bucket testbucket | grep "Key" | wc -l
aws s3api list-objects-v2 --bucket BUCKET_NAME | grep "Key" | wc -l
możesz użyć tego polecenia, aby uzyskać szczegółowe informacje
aws s3api list-objects-v2 --bucket BUCKET_NAME
Przeskanuj określony folder
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
Jeśli szukasz określonych plików, powiedzmy .jpg
obrazów, możesz wykonać następujące czynności:
aws s3 ls s3://your_bucket | grep jpg | wc -l
Poniżej opisano, jak możesz to zrobić za pomocą klienta 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;
}
}
Oto wersja boto3 skryptu Pythona osadzona powyżej.
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: // nazwa-zasobnika / prefiks-folderu-jeśli-jakiekolwiek --recursive | wc -l