Как узнать размер каталога Linux или Mac OS X из командной строки? [Дубликат]

74

На этот вопрос уже есть ответ здесь:

Какую команду я использую, чтобы найти размер всех файлов (рекурсивно) в каталоге Linux или Mac OS X?

Дэрил Спитцер
источник
2
Вы можете использовать -kопцию, чтобы использовать размер блока 1K-байт
Zoker
Я просто хочу порекомендовать это бесплатное программное обеспечение под названием 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. (В этом наборе файлов нет никаких странных разветвлений или xattrs.) Это значительно меньше значения, сообщаемого du.

Вот как это работает: он получает список всех файлов и передает их ls -l; затем awkиспользуется для подсчета байтов. -type fФлаг там так , что только файлы (а не каталоги) будут посланы ls. Без этого флага он также будет отправлять имена каталогов ls, и каждый файл будет указан дважды: один раз как отдельный файл и один раз как элемент в каталоге.

Версия GNU duможет давать значения в реальных байтах вместо блоков. К сожалению, версия BSD duне такая гибкая.

WCH
источник
Отличное объяснение. Интересно, что при использовании duиз GNU 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если вы хотите что-то более легко читаемое.
Джои
@ Йоханнес, я думаю, ты должен опубликовать этот комментарий как ответ, чтобы его можно было принять?
Арджан
Я нахожу опцию -c избыточной (по крайней мере, в Mac OS X) и du -sh подавляет промежуточные итоги.
Дэрил Спитцер
Ага, я не знал, что можно принять собственный ответ. Теперь, по крайней мере, люди знают, что вопрос решен.
Арджан
Я с радостью приму новый ответ, который улучшит мой.
Дэрил Спитцер
9

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
кислота
источник
Если вы хотите сделать то же самое на Ubuntu:find . -type f -print0 | xargs -0 stat -c%s | awk '{b+=$1} END {print b}'
Родриго Поло
Есть ли способ получить этот результат в удобочитаемом формате?
anon58192932
6

Вы можете использовать, du -ah .который отображает размеры всех файлов и каталогов рекурсивно.

Это может быть объединено с sort, так что вы увидите топ-20 крупнейших каталогов в текущей папке:

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

Примечание. Опция -hfor 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
kenorb
источник
Первая команда не работает на моем macOS 10.12.1 #du -ah. | сортировать -rh | head -20 sort: неверный параметр - h Попробуйте `sort --help 'для получения дополнительной информации.
nucleartux
3
@nucleartux Проверьте примечание под командой. Это работает в сортировке GNU, которую вы можете установить в macOS через:, в brew install coreutilsпротивном случае используйте команду сортировки BSD в конце без -h.
Кенорб
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

Malte
источник