2009-08-13 20:00:15 +0000 2009-08-13 20:00:15 +0000
76
76

Как получить из командной строки размер каталога Linux или Mac OS X?

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

Ответы (5)

83
83
83
2012-03-18 05:54:47 +0000

Версия 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 не так гибка.

75
75
75
2009-08-13 20:01:52 +0000

Показать размер одного файла

du -h path_to_a_file

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

du -h path_to_a_directory

Показать размер содержимого директории:

du -sh path_to_a_directory

9
9
9
2013-11-11 22:31:48 +0000

du - сообщает disk use, а не file size.

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

выше код терминала (im на osx 10.6) предлагает для меня лучший результат и является waaay быстрее, чем “найти … -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
6
6
6
2015-03-05 14:03:07 +0000

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

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

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

Примечание: Опция -h для sort недоступна на OSX/BSD, поэтому вам нужно установить sort из coreutils (например, через brew) и применить путь bin к PATH, например,

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

Иначе используйте 0x6&:

du -a . | sort -rn | head -20
2
2
2
2014-03-05 11:30:06 +0000

Я объединил все твои подходы и объединил их с читаемым человеком выводом - результат:

#!/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

Похожие вопросы

6
10
12
7
12