На этот вопрос уже есть ответ здесь:
Какую команду я использую, чтобы найти размер всех файлов (рекурсивно) в каталоге 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. (В этом наборе файлов нет никаких странных разветвлений или 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}'
Код терминала выше (im на OSX 10.6) предлагает для меня лучший результат и работает быстрее, чем "find ... -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
for 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
опцию, чтобы использовать размер блока 1K-байт