Если я чего-то не упускаю, кажется, что ни один из API, на который я смотрел, не скажет вам, сколько объектов находится в <S3 bucket>/<folder>
. Есть ли способ подсчитать?
Как узнать, сколько объектов я сохранил в корзине S3?
Ответы (30)
Нет способа, если вы
перечислите их все партиями по 1000 (что может быть медленным и отнимать пропускную способность - amazon, похоже, никогда не сжимает ответы XML) или
войдите в свою учетную запись на S3 и выберите «Учетная запись - Использование». Похоже, отдел биллинга точно знает, сколько объектов вы сохранили!
Простая загрузка списка всех ваших объектов на самом деле займет некоторое время и будет стоить некоторых денег, если у вас хранится 50 миллионов объектов.
Также см. этот поток о StorageObjectCount, который находится в данных об использовании .
S3 API, чтобы получить хотя бы основы, даже если ему уже несколько часов, было бы здорово.
Использование AWS CLI
aws s3 ls s3://mybucket/ --recursive | wc -l
or
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
Вы можете посмотреть раздел метрик Cloudwatch. чтобы получить приблизительное количество хранимых объектов.
У меня около 50 миллионов товаров, и на подсчет с помощью aws s3 ls
ушло больше часа.
aws s3 ls s3://mybucket/mydirectory/ --recursive | wc -l
- person tim peterson; 16.05.2016
ls dir | wc -l
- person George Ogden; 20.03.2021
Существует переключатель --summarize
, который включает сводную информацию о сегменте (т. Е. Количество объектов, общий размер).
Вот правильный ответ с помощью AWS cli:
aws s3 ls s3://bucketName/path/ --recursive --summarize | grep "Total Objects:"
Total Objects: 194273
См. документацию.
Total Objects: 7235
Total Size: 475566411749
- так просто.
- person bonh; 16.08.2017
Хотя это старый вопрос, и отзывы были предоставлены в 2015 году, сейчас это намного проще, поскольку в веб-консоли S3 включена опция «Получить размер»:
Что обеспечивает следующее:
Теперь есть простое решение с S3 API (доступно в клике AWS):
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[])]"
Illegal token value '(Contents[])]'
(версия 1.2.9 aws-cli) при использовании только --bucket my-bucket
и A client error (NoSuchBucket) occurred when calling the ListObjects operation: The specified bucket does not exist
при использовании --bucket s3://my-bucket
. (Он определенно существует и содержит более 1000 файлов.)
- person Darren Cook; 01.02.2016
Если вы используете инструмент командной строки s3cmd, вы можете получить рекурсивный список определенного сегмента, выводя его в текстовый файл.
s3cmd ls -r s3://logs.mybucket/subfolder/ > listing.txt
Затем в Linux вы можете запустить wc -l для файла, чтобы подсчитать строки (1 строка на объект).
wc -l listing.txt
-r
в команде предназначен для --recursive
, поэтому он должен работать и для подпапок.
- person Deepak Joy Cheenath; 28.09.2015
aws s3 ls
, а не s3cmd, потому что это быстрее. б.) Для больших ведер это может занять много времени. На файлы размером 1 мил ушло около 5 минут. c.) См. мой ответ ниже об использовании cloudwatch.
- person mastaBlasta; 04.02.2016
Вы можете использовать метрики AWS cloudwatch для s3, чтобы увидеть точное количество для каждой корзины.
2020/10/22
С Консолью AWS
Используйте метрики AWS Cloudwatch
С AWS CLI
Количество объектов:
or:
aws s3api list-objects --bucket <BUCKET_NAME> --prefix "<FOLDER_NAME>" | wc -l
or:
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"}'
or:
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 Billing", затем "Отчеты", а затем "Отчеты об использовании AWS". Выберите Amazon Simple Storage Service, затем Operation StandardStorage. Затем вы можете загрузить CSV-файл, который включает UsageType для StorageObjectCount, в котором указано количество элементов для каждой корзины.
В командной строке AWS CLI используйте ls plus --summarize
. Он предоставит вам список всех ваших элементов и общее количество документов в определенной корзине. Я не пробовал это с ведрами, содержащими под-ведра:
aws s3 ls "s3://MyBucket" --summarize
Это займет немного времени (перечисление моих 16 + K документов заняло около 4 минут), но это быстрее, чем подсчет 1K за раз.
Вы можете легко получить общее количество и историю, если вы перейдете на вкладку «Управление» консоли s3 и затем щелкните «Метрики» ... Снимок экрана вкладки
NumberOfObjects (count/day)
? Было бы лучше, так как это напрямую связано с вопросом. На скриншоте вы показываете BucketSizeBytes (bytes/day)
, который, хотя и полезен, не имеет прямого отношения к проблеме.
- person guzmonne; 24.07.2019
Один из самых простых способов подсчитать количество объектов в s3:
Шаг 1. Выберите корневую папку
Шаг 2. Нажмите Действия - ›Удалить (очевидно, будьте осторожны - не удаляйте его)
Шаг 3: Подождите несколько минут. AWS покажет вам количество объектов и их общий размер.
В s3cmd просто выполните следующую команду (в системе Ubuntu):
s3cmd ls -r s3://mybucket | wc -l
Если вы используете AWS CLI в Windows, вы можете использовать Measure-Object
из PowerShell для получения общего количества файлов, как wc -l
в * nix.
PS C:\> aws s3 ls s3://mybucket/ --recursive | Measure-Object
Count : 25
Average :
Sum :
Maximum :
Minimum :
Property :
Надеюсь, это поможет.
API вернет список с шагом 1000. Проверьте свойство IsTruncated, чтобы узнать, есть ли еще. Если есть, вам нужно сделать еще один вызов и передать последний полученный ключ в качестве свойства Marker при следующем вызове. Затем вы продолжите такой цикл до тех пор, пока IsTruncated не станет ложным.
См. Этот документ Amazon для получения дополнительной информации: Итерация по многостраничным результатам
Старая ветка, но все еще актуальна, так как я искал ответ, пока не понял это. Я хотел подсчитать количество файлов с помощью инструмента на основе графического интерфейса (т.е. без кода). Я уже использую инструмент под названием 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 файл, и я подсчитал их менее чем за минуту.
Я использовал скрипт python с сайта scalablelogic.com (добавление в журнал учета). Сработало отлично.
#!/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
С 18 ноября 2020 г. появился более простой способ получить эту информацию, не облагая налогом запросы API:
Встроенная бесплатная панель управления по умолчанию позволяет вам видеть счетчик для всех сегментов или отдельных сегментов на вкладке сегментов. Существует множество раскрывающихся списков для фильтрации и сортировки практически любой разумной метрики, которую вы можете найти.
Ни один из API не даст вам счет, потому что на самом деле нет специального API Amazon для этого. Вам нужно просто запустить список содержимого и подсчитать количество возвращаемых результатов.
Вот версия скрипта 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)`
aws s3 ls s3: // имя-ведра / префикс-папки-если-есть --recursive | wc -l
Выберите корзину / папку - ›Нажмите действия -› Нажмите «Рассчитать общий размер».
Поддержка 3Hub прекращена. Есть лучшее решение: вы можете использовать Transmit (только для Mac), а затем просто подключитесь к своей корзине и выберите Show Item Count
из меню View
.
Вы можете загрузить и установить браузер s3 со страницы http://s3browser.com/. Когда вы выбираете сегмент в правом центре, вы можете увидеть количество файлов в сегменте. Но размер, который он показывает, неверен в текущей версии.
Губы
Потенциально вы можете использовать инвентарь Amazon S3, который предоставит вам список объектов в файле csv.
Также можно сделать с помощью gsutil du
(да, с помощью инструмента Google Cloud)
gsutil du s3://mybucket/ | wc -l
Вы можете просто выполнить эту команду 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
Если вы ищете определенные файлы, скажем .jpg
изображения, вы можете сделать следующее:
aws s3 ls s3://your_bucket | grep jpg | wc -l
Ниже показано, как это можно сделать с помощью 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;
}
}
Самый простой способ - использовать консоль разработчика, например, если вы используете Chrome, выберите Инструменты разработчика, и вы увидите следующее: вы можете либо найти и подсчитать, либо сопоставить, например 280-279 + 1 = 2
...