Загальний розмір вмісту всіх файлів у каталозі [закрито]


103

Коли я використовую lsабо du, я отримую кількість дискового простору, який займає кожен файл.

Мені потрібна загальна сума всіх даних у файлах і підкаталогах, які я отримав, якби відкрив кожен файл і підрахував байти. Бонусні бали, якщо я можу це отримати, не відкриваючи кожен файл і не рахуючи.


1
lsнасправді показує кількість байтів у кожному файлі, а не кількість місця на диску. Чи достатньо це для ваших потреб?
Грег Х'югілл

3
Зауважте, що duне можна використовувати відповіді на це питання. Він показує кількість дискового простору, яке каталог займає на диску (дані файлів плюс розмір метаінформації допоміжної файлової системи). duВихід може бути навіть менше , ніж загальний розмір всіх файлів. Це може статися, якщо файлова система може зберігати дані, стиснуті на диску, або якщо використовуються жорсткі посилання. Правильні відповіді ґрунтуються на lsта find. Дивіться відповіді Нельсона та bytepan тут, або цю відповідь: unix.stackexchange.com/a/471061/152606
anton_rh

Відповіді:


108

Якщо ви хочете "очевидний розмір" (тобто кількість байтів у кожному файлі), а не розмір, який беруть файли на диску, скористайтесь опцією -bабо --bytes(якщо у вас є система Linux з GNU coreutils ):

% du -sbh <directory>

1
працює на моїх нових коробках з червоним капелюхом, на жаль, не на моїй вбудованій коробці Dev.
Артур Ульфельт

3
Чи є простий спосіб показати "очевидний розмір" у читаному для людини форматі? Під час використання du -shb(як запропоновано цією відповіддю) -bналаштування, здається, перекриває -hналаштування.
Mathias Bynens

6
@MathiasBynens Зміна порядку прапорів (тобто du -sbh <dir>). Працює для мене.
Луїс Е.

2
@MathiasBynensdu -sh --apparent-size /dir/
Jongosi

2
@Arkady Я спробував ваше рішення на CentOS і Ubuntu, і є невелика помилка. Ви хочете "du -sbh". Прапор "-h" повинен бути останнім.
theJollySin

46

Використання du -sb:

du -sb DIR

За бажанням додайте hопцію для більш зручного виводу:

du -sbh DIR

4
-b , здається, нелегальний варіант для MacOS »йі
lynxoid

3
@lynxoid: Ви можете встановити версію GNU з варивом: brew install coreutils. Він буде доступний як команда gdu.
neu242

1
Не працює. ls-> file.gz hardlink-to-file.gz. stat -c %s file.gz-> 9657212. stat -c %s hardlink-to-file.gz-> 9657212. du -sb-> 9661308. Це, безумовно, не загальний розмір вмісту, а розмір, який каталог набирає на диску.
anton_rh

24

CD в ​​каталог, потім:

du -sh

ftw!

Спочатку писав про це тут: https://ao.gl/get-the-total-size-of-all-the-files-in-a-directory/


1
Це просто і працює! Дякую. Іноді мені подобається додавати -Lваріант, так що duслід посилань.
conradkleinespel

2
працює для мене (на OS X)
sam boosalis

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

17

Просто альтернатива:

ls -lAR | grep -v '^d' | awk '{total += $5} END {print "Total:", total}'

grep -v '^d' виключить каталоги.


4
Ідеально, також додайте параметр -a, щоб отримати "приховані файли" (все, що починається з періоду)
Ніколі

Ізольовано під певний тип файлу (у даному випадку PNG) та виражено у МБ для більшої читабельності: ls -lR | grep '.png$' | awk '{total += $5} END {print "Total:", total/1024/1024, "MB"}'
MusikPolice

Це правильна відповідь. На відміну від duцього рішення насправді рахує загальний розмір усіх даних у файлах так, ніби вони були відкриті один за одним, і їхні байти підраховувались. Але так, додавання -Aпараметра потрібно також для підрахунку прихованих файлів.
anton_rh

13

Формат "% s" stat дає вам фактичну кількість байтів у файлі.

 find . -type f |
 xargs stat --format=%s |
 awk '{s+=$1} END {print s}'

Не соромтеся замінювати свій улюблений метод підсумовування чисел .


4
Переважно використовувати "find. -Type f -print0 | xargs -0 ...", щоб уникнути проблем з певними іменами файлів (містять пробіли тощо).
hlovdal

1
так, хороший момент. якщо його не було в bsd 4.2, я не пам'ятаю, щоб ним скористатися :-(
Нельсон

3
find -print0і xargs -0потрібні для назви файлів з пробілами. OS X хоче stat -f %z.
Корнель

1
(Зауважте, що stat працює з розрідженими файлами, повідомляючи про великий номінальний розмір файлу, а не про менші блоки, що використовуються на диску, як-от duзвіти.)
Нельсон

1
На відміну від багатьох інших відповідей, які помилково використовують duутиліту, ця відповідь є правильною. Тут дуже схожа відповідь: unix.stackexchange.com/a/471061/152606 . Але я б застосував ! -type dзамість того, -type fщоб рахувати символьні посилання (розмір самого посилання (як правило, декілька байтів), а не розмір файлу, на який він вказує).
anton_rh

3

Якщо ви використовуєте "du" для "box "в emebedded системі, ви не можете отримати точні байти з du, ви можете отримати лише кбайт.

BusyBox v1.4.1 (2007-11-30 20:37:49 EST) multi-call binary

Usage: du [-aHLdclsxhmk] [FILE]...

Summarize disk space used for each FILE and/or directory.
Disk space is printed in units of 1024 bytes.

Options:
        -a      Show sizes of files in addition to directories
        -H      Follow symbolic links that are FILE command line args
        -L      Follow all symbolic links encountered
        -d N    Limit output to directories (and files with -a) of depth < N
        -c      Output a grand total
        -l      Count sizes many times if hard linked
        -s      Display only a total for each argument
        -x      Skip directories on different filesystems
        -h      Print sizes in human readable format (e.g., 1K 243M 2G )
        -m      Print sizes in megabytes
        -k      Print sizes in kilobytes(default)

3

Коли папка створена, багато файлових систем Linux виділяють 4096 байт для зберігання деяких метаданих про сам каталог. При збільшенні каталогу цей простір збільшується кратним 4096 байтів.

команда du (з опцією -b або без) беремо підрахунок цього простору , як ви бачите:

mkdir test && du -b test

у вас вийде 4096 байт за порожній реж. Отже, якщо помістити 2 файли по 10000 байт всередині dir, загальна сума, подана du -sb, склала б 24096 байт.

Якщо ви уважно читаєте запитання, це не те, що задають. Запитуючий запитав:

загальна сума всіх даних у файлах та підкаталогах, які я отримав, якби відкрив кожен файл і порахував байти

що у наведеному вище прикладі має бути 20000 байт, а не 24096.

Отже, правильною відповіддю IMHO може бути поєднання відповіді Нельсона та пропозиції hlovdal для обробки імен файлів, що містять пробіли:

find . -type f -print0 | xargs -0 stat --format=%s | awk '{s+=$1} END {print s}'

2

Існує щонайменше три способи отримати "загальну суму всіх даних у файлах і підкаталогах" у байтах, які працюють як в Linux / Unix, так і в Git Bash для Windows, перелічених нижче, щоб в середньому швидше переходити на найповільніші. Для довідки, вони були виконані в корені досить глибокої файлової системи ( docrootв установці Magento 2 Enterprise, що містить 71,158 файлів у 30,027 каталогах).

1.

$ time find -type f -printf '%s\n' | awk '{ total += $1 }; END { print total" bytes" }'
748660546 bytes

real    0m0.221s
user    0m0.068s
sys     0m0.160s

2.

$ time echo `find -type f -print0 | xargs -0 stat --format=%s | awk '{total+=$1} END {print total}'` bytes
748660546 bytes

real    0m0.256s
user    0m0.164s
sys     0m0.196s

3.

$ time echo `find -type f -exec du -bc {} + | grep -P "\ttotal$" | cut -f1 | awk '{ total += $1 }; END { print total }'` bytes
748660546 bytes

real    0m0.553s
user    0m0.308s
sys     0m0.416s


Ці два також працюють, але вони покладаються на команди, які не існують на Git Bash для Windows:

1.

$ time echo `find -type f -printf "%s + " | dc -e0 -f- -ep` bytes
748660546 bytes

real    0m0.233s
user    0m0.116s
sys     0m0.176s

2.

$ time echo `find -type f -printf '%s\n' | paste -sd+ | bc` bytes
748660546 bytes

real    0m0.242s
user    0m0.104s
sys     0m0.152s


Якщо ви хочете лише загальну суму для поточного каталогу, додайте -maxdepth 1до find.


Зауважте, що деякі із запропонованих рішень не дають точних результатів, тому я б дотримувався вищезазначених рішень.

$ du -sbh
832M    .

$ ls -lR | grep -v '^d' | awk '{total += $5} END {print "Total:", total}'
Total: 583772525

$ find . -type f | xargs stat --format=%s | awk '{s+=$1} END {print s}'
xargs: unmatched single quote; by default quotes are special to xargs unless you use the -0 option
4390471

$ ls -l| grep -v '^d'| awk '{total = total + $5} END {print "Total" , total}'
Total 968133

1
Що стосується Git Bash для Windows, - у випадку Cygwin dcє частиною bcпакету, тому дляdc його отримання потрібно встановити bc.
рувим

1

Для Win32 DOS ви можете:

c:> dir / sc: \ каталог \ ви \ хочете

і передостанній рядок підкаже, скільки байтів займають файли.

Я знаю, що це читає всі файли та каталоги, але працює швидше в деяких ситуаціях.


1

duце зручно, але findкорисно в тому випадку, якщо ви хочете обчислити розмір лише деяких файлів (наприклад, використовуючи фільтр за розширенням). Також зауважте, що findсамі можуть надрукувати розмір кожного файлу в байтах. Для обчислення загального розміру ми можемо з'єднати dcкоманду наступним чином:

find . -type f -printf "%s + " | dc -e0 -f- -ep

Тут findгенерується послідовність команд для dcподібних 123 + 456 + 11 +. Хоча, виконана програма має бути схожою 0 123 + 456 + 11 + p(пам’ятайте нотацію постфікса).

Отже, для отримання завершеної програми нам потрібно поставити 0стек перед виконанням послідовності з stdin та надрукувати верхнє число після виконання ( pкоманда в кінці). Ми досягаємо цього за допомогою dcваріантів:

  1. -e0це лише ярлик для того, -e '0'що ставиться 0на стек,
  2. -f-призначений для читання та виконання команд із stdin (що генерується findтут),
  3. -epпризначений для друку результату ( -e 'p').

Щоб надрукувати розмір у форматі MiB, 284.06 MiBми можемо використати -e '2 k 1024 / 1024 / n [ MiB] p'замість нього пункт 3 (більшість пробілів не є обов'язковим).


1

Це може допомогти:

ls -l| grep -v '^d'| awk '{total = total + $5} END {print "Total" , total}'

Наведена вище команда підсумовує всі файли, що залишають розмір каталогів.


1
Зауважте, що це рішення дуже схоже на відповідь Баруна. Але це рішення не підсумовує файли в підкаталогах.
ruvim

1
@ruvim, він також не сумує приховані файли. Щоб підсумовувати приховані файли, -Aпараметр потрібно додати до ls.
anton_rh

0

Використання:

$ du -ckx <DIR> | grep total | awk '{print $1}'

Де <DIR> - каталог, який ви хочете перевірити.

'-C' дає великі загальні дані, які витягуються за допомогою команди 'grep total', а кількість в Кбайт витягується за допомогою команди awk.

Єдине застереження тут - якщо у вас є підкаталог, що містить текст "total", він також вийде.

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