Як отримати розмір каталогу Linux або Mac OS X з командного рядка? [дублікат]


74

На це питання вже є відповідь тут:

Яку команду я використовую для пошуку розміру всіх файлів (рекурсивно) в каталозі Linux або Mac OS X?


2
Ви можете скористатися -kопцією для використання блоку розміром 1
Кбайт

Я просто хочу порекомендувати це безкоштовне програмне забезпечення під назвою Disk Inventory X. завантажити його тут derlien.com це просто використовувати для mac osx
Nimitack

Замість цього du, я використовую ncdu, ви можете знайти посилання тут, remysharp.com/2018/08/23/cli-improved
Алан Донг,

Відповіді:


82

Версія BSD, що duвикористовується в OS X розміром звітів з 512-байтовими блоками - розміри, по суті, округляються до наступного 512-байтового значення. Це повідомляє вам простір на диску, який більший за кількість даних. Якщо у вас багато невеликих файлів, різниця може бути великою.

Ось приклад.

Це значення з регулярним du. Це в 512-байтових блоках:

$ du -s
248   .

Ці -hрезультати прапора в більш читається числа, в кілобайт. Як і очікувалося, це половина кількості 512-байтних блоків:

$ du -hs
124K  .

Нарешті, ви можете використовувати findта awkнадати суму фактичних байтів у файлах. Це щось повільно, але це працює:

$ find . -type f -exec ls -l {} \; | awk '{sum += $5} END {print sum}'
60527

Це значення точно відповідає кількості, повідомленому у вікні Finder's Get Info. (У цьому наборі файлів немає дивних форк або xattrs.) Це значно менше значення, про яке повідомляється du.

Ось як це працює: він отримує список усіх файлів і передає їх у ls -l; потім awkвикористовується для підрахунку байтів. -type fПрапор там так , що тільки файли (а не каталоги) будуть послані ls. Без цього прапора він також надсилатиме імена каталогів ls, і кожен файл буде вказаний двічі: один раз як окремий файл та один раз як елемент у каталозі.

Версія GNU duможе давати значення у фактичних байтах замість блоків. Прикро, що версія BSD duне така гнучка.


Чудове пояснення. Цікаво, що при використанні duGNU coreutils з -bопцією я отримую інший результат, ніж з вашою findтрубою. Для каталогу в 36 ГБ я отримую різницю в 82 КБ.
Штефан Шмідт

чи є можливість роздрукувати це у більш читаному для людини форматі?
anon58192932

75

Показати розмір одного файлу

du -h path_to_a_file

Показати розмір вмісту каталогу, кожного підкаталогу та кожного окремого файлу:

du -h path_to_a_directory

Показати розмір вмісту каталогу:

du -sh path_to_a_directory


25
du -schякщо ви хочете щось легше читати.
Джої

@Johannes, я думаю, ви повинні опублікувати цей коментар як відповідь, щоб його можна було прийняти?
Ар'ян

Я вважаю, що параметр -c є зайвим (принаймні, на Mac OS X) і du -sh придушує підсумкові дані.
Дарил Спітцер

Ага, я не знав, що можна прийняти власну відповідь. Тепер принаймні люди знають, що питання вирішено.
Ар’ян

Я з радістю прийму нову відповідь, яка є покращенням у моєму.
Дарил Спітцер

9

du - повідомляє про використання диска не розміром файлу .

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

вище термінального коду (я на OSX 10.6) пропонує для мене найкращий результат і йде швидше, ніж "знайти ... -exec"

швидкий орієнтир

time find . -type f -print0 | xargs -0 stat -f'%z' | awk '{b+=$1} END {print b}'
4744010970

real    0m0.086s
user    0m0.029s
sys 0m0.073s

time find . -type f -exec ls -l {} \; | awk '{sum += $5} END {print sum}'
4744010970

real    0m18.515s
user    0m2.929s
sys 0m9.339s

Якщо ви хочете зробити те ж саме в Ubuntu:find . -type f -print0 | xargs -0 stat -c%s | awk '{b+=$1} END {print b}'
Rodrigo Polo

чи є спосіб отримати такий результат у читаному для людини форматі?
anon58192932

5

Ви можете використовувати, du -ah .який відображає розміри всіх файлів і каталогів рекурсивно.

Це можна комбінувати із sort, тому ви побачите топ-20 найбільших каталогів у поточній папці:

du -ah . | sort -rh | head -20

Примітка: Варіант -hдля sortнедоступний на OSX / BSD, так що ви , щоб встановити sortз coreutils(наприклад , з допомогою brew) і застосувати шлях до бен PATH, наприклад ,

export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH" # Add a "gnubin" for coreutils.

В іншому випадку використовуйте:

du -a . | sort -rn | head -20

Перша команда не працює на моєму macOS 10.12.1 #du -ah. | сортувати -rh | head -20 сортування: недійсний варіант - h Спробуйте `sort --help 'для отримання додаткової інформації.
nucleartux

2
@nucleartux Перевірте примітку під командою. Це працює в GNU сортуванні, який можна встановити на macOS за допомогою: в brew install coreutilsіншому випадку використовуйте команду BSD сортування в кінці без -h.
kenorb

2

Я поєднав усі ваші програми та поєднав це з результатом, зрозумілим для людини, результат:

#!/bin/sh
find $1 -type f -print0 | xargs -0 stat -f'%z' | awk '{b+=$1} END {print b}' | awk '{ sum=$1 ; hum[1024**3]="Gb";hum[1024**2]="Mb";hum[1024]="Kb"; for (x=1024**3; x>=1024; x/=1024){ if (sum>=x) { printf "%.2f %s\n",sum/x,hum[x];break } }}'

Посилання на суть: https://gist.github.com/mlegenhausen/9365461

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