Здесь много ответов, многие из которых являются дубликатами. Я вижу три тенденции: прохождение второго вызова du, использование сложного кода shell / awk и использование других языков.
Вот POSIX-совместимое решение с использованием du и awk, которое должно работать в любой системе.
Я выбрал немного другой подход, добавив, -xчтобы убедиться, что мы остаемся в одной файловой системе (эта операция мне всегда нужна, когда у меня мало места на диске, так зачем отсеивать то, что я смонтировал в этом дереве FS или переместил символьная ссылка назад) и отображение постоянных единиц для облегчения визуального анализа. В этом случае я обычно выбираю не сортировать, чтобы лучше видеть иерархическую структуру.
sudo du -x | awk '
$1 > 2^20 { s=$1; $1=""; printf "%7sG%s\n", sprintf("%.2f",s/2^21), $0 }'
(Так как это в последовательных единицах, вы можете добавить, | sort -nесли вы действительно хотите отсортировать результаты.)
Это отфильтровывает любой каталог, чье (совокупное) содержимое не может превышать 512 МБ, а затем отображает размеры в гигабайтах. По умолчанию, ий использует размер блока 512 байт (так состояние AWK от 2 20 блоков 512 и его- 21 делитель преобразует единицы в ГБ - мы могли бы использовать du -kxс $1 > 512*1024и s/1024^2более читаемым человеком). Внутри условия awk мы устанавливаем sразмер, чтобы мы могли удалить его из строки ( $0). При этом сохраняется разделитель (который свернут в один пробел), поэтому окончательный %sпредставляет пробел, а затем имя агрегированного каталога. %7sвыравнивает округленный %.2fразмер ГБ (увеличьте, %8sесли у вас> 10 ТБ).
В отличие от большинства решений здесь, это правильно поддерживает каталоги с пробелами в их именах (хотя каждое решение, включая это, будет неправильно обрабатывать имена каталогов, содержащие разрывы строк).