Як я можу визначити, скільки предметів я зберігав у відрі S3?


155

Якщо я щось не пропускаю, здається, що жоден з API, який я переглянув, не скаже вам, скільки об’єктів знаходиться у відро / папці S3 (префікс) S3. Чи є спосіб отримати підрахунок?


Це питання може бути корисним: stackoverflow.com/questions/701545/…
Брендан Лонг,

1
Рішення існує в даний час в 2015 році: stackoverflow.com/a/32908591/578989
Mayank Джайсвал

Дивіться мою відповідь нижче: stackoverflow.com/a/39111698/996926
advncd

2017 Відповідь: stackoverflow.com/a/42927268/4875295
cameck

Відповіді:


39

Немає способу, якщо ви

  1. перелічіть їх усіми групами по 1000 (що може бути повільним і смоктати смугу пропускання - Amazon, здається, ніколи не стискає відповіді XML), або

  2. увійдіть до свого облікового запису на S3 та перейдіть до облікового запису - використання. Здається, відділ виставлення рахунків точно знає, скільки об’єктів ви зберегли!

Просто завантаження списку всіх ваших об’єктів фактично зайнять певний час і коштуватиме трохи грошей, якщо у вас збережено 50 мільйонів об’єктів.

Також дивіться цю тему про StorageObjectCount - що є в даних про використання.

API S3, щоб отримати хоча б основи, навіть якщо це було кілька годин, було б чудово.


Це посилання, до речі, мертве.
поля


Якщо ви ледачі, як я, Newvem в основному робить це від вашого імені та збирає / відстежує результати на рівні відра для вашого облікового запису S3.
rcoup

2
Чи можете ви оновити свою відповідь, щоб включити відповідь @ MayankJaiswal?
Джозеф Кейсі

1
відділ виставлення рахунків знає все! недарма вони мають владу випадково зняти східне узбережжя
ski_squaw

256

Використання 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

Ви можете переглянути метричний розділ cloudwatch, щоб отримати приблизно кількість об'єктів, що зберігаються. введіть тут опис зображення

У мене є близько 50 мільйонів продуктів, і на це знадобилося більше години aws s3 ls


18
Це повинно бути ближче до верху.
Джозеф Кейсі

3
@JosephMCasey Я згоден. Це також працює, щоб дати кількість об’єктів у каталозі з таким відром:aws s3 ls s3://mybucket/mydirectory/ --recursive | wc -l
tim peterson

1
Дає цю помилку, коли я запускав вище в cmd-підказці - 'wc' не розпізнається як внутрішня чи зовнішня команда, функціонуюча програма чи пакетний файл. - Я досить новачок у цьому, щоб хтось міг дати рішення?
Сандун

Попередження про те, що CloudWatch не здається дуже надійним. У одному відрі є файл mp4, який CloudWatch (показник NumberOfObjects) вважає 2300 окремих об'єктів. Я отримав правильний номер у AWS CLI.
AlexK

Чому "середній"? Хтось не захотів би замість цього "Суму"?
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

16
На жаль, все ще є основні
переліки

скільки коштуватиме виконання цього завдання на відро з об'єктами 5М?
Психозой

2
Ця відповідь є надзвичайно неефективною, потенційно дуже повільною та дорогою. Він перебирає весь відро, щоб знайти відповідь.
ткач

2
І можу додати, що ітерація понад 1,2 мільярда об'єктів, що зберігаються у стандартному сховищі, може коштувати близько 6000 доларів.
C Джонсон

66

Хоча це старе питання, і відгуки були надані у 2015 році, зараз це набагато простіше, оскільки веб-консоль S3 ввімкнула опцію "Отримати розмір":

введіть тут опис зображення

Що передбачає наступне:

введіть тут опис зображення


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

3 примітки до цього. a.) Ви повинні використовувати, aws s3 lsа не s3cmd, тому що це швидше. б.) Для великих відрів це може зайняти тривалий час. Знадобилося близько 5 хв для 1мл файлів. в.) Дивіться мою відповідь нижче про використання хмарного годинника.
mastaBlasta

46

Просте рішення з API S3 зараз (доступне в кліпі 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[])]"

1
Рафаеле, запит на вашу папку працює чудово, за винятком випадків, коли папка порожня або її немає, тоді ви отримуєте: У функції length (), недійсний тип для значення: None, очікуваний один із: ['string', 'array' , 'object'], отримано: "null" Чи є спосіб просто зробити його вихід 0, якщо папка порожня або не виходить?
користувач3591836

1
Я отримую 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+ файлів.)
Даррен Кук,

@DarrenCook видалити s3: // з імені відра. Схоже, клієнт не підтримує протокол.
Sriranjan Manjunath

Це набагато швидше, ніж приклади wc -l. З моїми відрами вона налічувала б приблизно 3-4 тис. Об'єктів / сек. Отже ~ 5 хв на мільйон об’єктів. "Отримати розмір" у веб-графічному інтерфейсі S3, ймовірно, використовується щось подібне під кришкою, оскільки це займає приблизно стільки ж часу.
непетер

Для дуже великих відер, це було єдиним рішенням , яке працювало для мене в розумні строки від (менше 20 хвилин)
Нік Sarafa

40

Ви можете використовувати показники AWS cloudwatch для s3, щоб переглянути точний підрахунок для кожного відра. показник хмарного перегляду при виборі відра


Я думаю, що це найкраща відповідь
Октав

Єдина реальна відповідь, не роблячи чогось смішного, як перерахування 1м + клавіш. Я забув, що це було там.
Ендрю Бекер

Для цього потрібно більше коштів. Кожне інше рішення масштабується погано з точки зору витрат і часу.
Аарон Р.

5

Перейдіть до програми AWS Billing, потім звітів, а потім звітів про використання AWS. Виберіть Amazon Simple Storage Service, а потім Operation StandardStorage. Тоді ви можете завантажити файл CSV, що включає UsageType StorageObjectCount, який містить список елементів для кожного відра.


4

Ви можете легко отримати загальний підрахунок та історію, якщо перейти на вкладку "Управління" на консолі s3, а потім натиснути на "Метрики" ... Знімок екрана вкладки


Ви можете оновити зображення, щоб показати NumberOfObjects (count/day)графік? Було б краще, оскільки це безпосередньо пов'язане з питанням. На екрані екрана ви показуєте, BucketSizeBytes (bytes/day)що, хоча й корисно, безпосередньо не пов’язане з проблемою.
guzmonne

1
Станом на 2019 рік це тепер має бути прийнятою відповіддю. Всі решта застарілі або повільні.
C Джонсон

2

Api поверне список з кроком 1000. Перевірте властивість IsTruncated, щоб побачити, чи є ще їх. Якщо вони є, вам потрібно здійснити інший дзвінок та передати останній ключ, який ви отримали як властивість Маркер під час наступного дзвінка. Потім ви продовжуватимете циклічно так, поки IsTruncated не буде помилковим.

Додаткову інформацію див. У цьому документі 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

Я використовував сценарій 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

Просто ви знаєте, що це не працює з boto3. Я подав пропозицію нижче як іншу відповідь.
fuzzygroup

2

У s3cmd просто запустіть таку команду (в системі Ubuntu):

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

13
Чому ви поставили запитання 5-річному віку, щоб опублікувати погано відформатовану копію наявної відповіді ?
Двобітовий алхімік

Попередня відповідь без необхідності передала вихід у файл txt.
mjsa

10
IMO, то це повинен бути коментар до цієї відповіді. Це справді банальна різниця.
Двобітовий алхімік

2
Здається, гідна відповідь - тим більше, що обрана відповідь на це питання починається з "Немає способу ...", і @mjsa дав однорядну відповідь.
Nan

Це не є гарною відповіддю, оскільки вона не враховує об'єкти, що переглядаються.
3h4x

2

Якщо ви використовуєте AWS CLI в Windows, ви можете використовувати Measure-ObjectPowerShell для отримання загальної кількості файлів, як 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: Зачекайте, поки кілька хвилин у вікні з’явиться кількість об'єктів та їх загальний розмір.

UpVote, якщо ви знайдете рішення.


1

Жоден з API не дасть вам рахунку, оскільки насправді не існує жодного специфічного API для Amazon. Вам потрібно просто запустити вміст списку і підрахувати кількість результатів, які повертаються.


З певних причин рубінові вкладки (right_aws / appoxy_aws) не містять у списку більше, ніж перші 1000 об'єктів. Чи є інші, які перелічать усі об'єкти?
поля

Коли ви запитуєте список, вони надають поле "NextToken", за допомогою якого ви можете знову надіслати запит разом із маркером, і він відобразить більше.
Мітч Демпсі

1

З командного рядка в AWS CLI використовуйте ls plus --summarize. Це дасть вам список усіх ваших предметів та загальну кількість документів у певному відрі. Я не пробував цього з відрами, що містять підрозділи:

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

Це може зайняти трохи довго (знадобилось перерахування моїх документів 16 + K близько 4 хвилин), але це швидше, ніж підрахунок 1К за один раз.



0

3Hub припинено. Є краще рішення, ви можете використовувати Transmit (лише для Mac), після чого просто підключитесь до свого відра і виберете Show Item Countз Viewменю.


На жаль, передача показує лише до 1000 предметів (і кількість предметів тому також розміщується на 1000)
Тіно

0

Ви можете завантажити та встановити браузер s3 з http://s3browser.com/ . Вибравши відро у правому центральному куті, ви побачите кількість файлів у відрі. Але розмір, який він показує, є невірним у поточній версії.

Губи


0

Найпростіший спосіб - це використовувати консоль розробника, наприклад, якщо ви перебуваєте в хромі, виберіть Інструменти для розробників, і ви можете побачити наступне, ви можете знайти і порахувати, або виконати відповідність, наприклад, 280-279 + 1 = 2

...


Чи можете ви додати трохи детальніше про те, як ви використовували інструменти для розробників, щоб визначити загальну кількість об'єктів у відрі.
Джугал Панчал

0

Ви потенційно можете використовувати інвентар Amazon S3, який надасть вам список об’єктів у файлі csv


0

Я знайшов інструмент браузера S3 дуже користувальницьким, він надає файли та папки та загальний підрахунок, а також розмір для будь-якої папки рекурсивно

Посилання для завантаження: https://s3browser.com/download.aspx



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

Ось вбудована вище версія boto3 сценарію python.

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: // ім'я відра / папка-префікс-якщо-яка --рекурсивна | wc -l


Він працює понад 1000, для мене нарахував 4258
KingAndrew

Рядки безпосередньо не відповідають кількості файлів. Тому що вони також мають цілий рядок саме для дати та каталогу.
CMCDragonkai

Команда працює для обмеженої кількості файлів. У моєму випадку кількість файлів становить понад мільйон, і це ніколи не дає жодного результату. Але це хороший варіант для обмежених файлів.
Джугал Панчал
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.