На це питання вже є відповідь тут:
Яку команду я використовую для пошуку розміру всіх файлів (рекурсивно) в каталозі Linux або Mac OS X?
du
, я використовую ncdu
, ви можете знайти посилання тут, remysharp.com/2018/08/23/cli-improved
На це питання вже є відповідь тут:
Яку команду я використовую для пошуку розміру всіх файлів (рекурсивно) в каталозі Linux або Mac OS X?
du
, я використовую ncdu
, ви можете знайти посилання тут, remysharp.com/2018/08/23/cli-improved
Відповіді:
Версія 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
не така гнучка.
du
GNU coreutils з -b
опцією я отримую інший результат, ніж з вашою find
трубою. Для каталогу в 36 ГБ я отримую різницю в 82 КБ.
Показати розмір одного файлу
du -h path_to_a_file
Показати розмір вмісту каталогу, кожного підкаталогу та кожного окремого файлу:
du -h path_to_a_directory
Показати розмір вмісту каталогу:
du -sh path_to_a_directory
du -sch
якщо ви хочете щось легше читати.
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
find . -type f -print0 | xargs -0 stat -c%s | awk '{b+=$1} END {print b}'
Ви можете використовувати, 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
brew install coreutils
іншому випадку використовуйте команду BSD сортування в кінці без -h
.
Я поєднав усі ваші програми та поєднав це з результатом, зрозумілим для людини, результат:
#!/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
-k
опцією для використання блоку розміром 1