Здесь много ответов, многие из которых являются дубликатами. Я вижу три тенденции: прохождение второго вызова 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 ТБ).
В отличие от большинства решений здесь, это правильно поддерживает каталоги с пробелами в их именах (хотя каждое решение, включая это, будет неправильно обрабатывать имена каталогов, содержащие разрывы строк).