linux processes

du

Размер файлов и директорий — детальный анализ использования дискового пространства

Описание

du (disk usage) — утилита для вычисления реального дискового пространства, занятого файлами и директориями. В отличие от df, которая работает на уровне файловых систем, du рекурсивно обходит указанные пути и суммирует размеры файлов. Это позволяет точно определить, какие директории «съели» место на диске.

du показывает выделенное дисковое пространство (disk blocks), а не логический размер файлов. Разреженные файлы (sparse files) могут занимать меньше места на диске, чем показывает ls -l. Размер блока по умолчанию зависит от настроек системы, поэтому всегда используйте флаг -h или -b для предсказуемого вывода.

Используйте du, когда нужно найти «тяжёлые» директории: после алерта от df о заполнении диска, при планировании архивирования, для анализа роста логов или кэша. Команда du -sh * | sort -rh | head -20 — одна из самых полезных однострочных команд в арсенале администратора.

Синтаксис

du [options] [file ...]

Без аргументов du обходит текущую директорию рекурсивно. Можно указать один или несколько путей.

# Размер текущей директории (суммарно) du -sh . # Топ директорий в /var du -sh /var/* # Рекурсивно с глубиной 2 уровня du -h --max-depth=2 /home

Вывод по умолчанию — размер в блоках 1024 байт и путь:

$ du /var/log 4 /var/log/apt/history.log 128 /var/log/apt 8 /var/log/auth.log ... 2048 /var/log

Флаги и опции

ФлагОписание
-hHuman-readable: размеры в K, M, G, T (степени 1024). Обязательный флаг для чтения вручную
-sSummary: показать только итог для каждого аргумента (не рекурсивно). Часто используется вместе с -h
-aAll: показать размер для каждого файла, не только директорий
-cДобавить итоговую строку (total) в конец вывода
--max-depth=NОграничить глубину рекурсии N уровнями. --max-depth=1 эквивалентно -s для поддиректорий
-d NКраткая форма --max-depth=N
-bРазмер в байтах (очевидный размер файла, не выделенные блоки)
-B sizeРазмер блока для вывода: -BM — в MB, -BG — в GB
-xНе выходить за пределы текущей файловой системы (пропустить смонтированные ФС)
--exclude=patternИсключить файлы/директории по шаблону. Пример: --exclude='*.log'
-LСледовать символическим ссылкам (по умолчанию — не следует)
--apparent-sizeПоказать логический размер файла (без учёта выравнивания блоков)
--timeПоказать время последней модификации для каждой директории

Паттерны использования

Найти «тяжёлые» директории

# Топ-10 самых больших элементов в /
du -sh /* 2>/dev/null | sort -rh | head -10

# Топ директорий в /var
du -sh /var/* | sort -rh | head -10

# Рекурсивно с уровнем 2
du -h --max-depth=2 /var | sort -rh | head -20

Размер текущей и дочерних директорий

# Размер каждой поддиректории (1 уровень)
du -sh */

# Суммарный размер текущей директории
du -sh .

# С итогом
du -shc /home/*/

Найти большие файлы

# Все файлы рекурсивно, сортировка
du -ah /var/log | sort -rh | head -20

# Только файлы > 100M (через find)
find /var -type f -size +100M \
  -exec du -sh {} \; | sort -rh

# Быстрый поиск крупных файлов
find / -xdev -type f -size +500M 2>/dev/null

Исключить определённые пути

# Исключить .git директории
du -sh --exclude='.git' /var/www/project

# Исключить несколько паттернов
du -sh \
  --exclude='*.log' \
  --exclude='node_modules' \
  /var/www/

# Не переходить на другие ФС
du -shx /

Мониторинг роста директории

# Текущий размер логов
du -sh /var/log/

# В скрипте мониторинга
LOG_SIZE=$(du -sb /var/log | cut -f1)
echo "Log size: $((LOG_SIZE / 1024 / 1024)) MB"

# watch: обновление каждые 5 сек
watch -n 5 'du -sh /var/log/*'

Сравнить очевидный и фактический размер

# Для разреженных файлов:
# Logical size (apparent) vs disk usage
du --apparent-size -sh sparse_file
du -sh sparse_file

# Размер Docker образов/volumes
du -sh /var/lib/docker/
du -sh /var/lib/docker/volumes/*/

Советы и предупреждения

Совет: du -sh * | sort -rh — ваш главный инструмент
Паттерн du -sh * | sort -rh | head -20 — универсальный способ быстро найти «виновника» заполненного диска. Запускайте в директории, на которую указывает df, и постепенно спускайтесь вглубь дерева директорий.
Совет: ncdu — интерактивная альтернатива
Утилита ncdu (установить: sudo apt install ncdu) предоставляет интерактивный ncurses-интерфейс для навигации по дереву директорий с сортировкой по размеру. Гораздо удобнее для интерактивного исследования, чем цепочки du | sort.
Внимание: du медленно работает на больших деревьях
Запуск du -sh / на заполненном сервере может занять несколько минут и создать нагрузку на I/O. На продакшн-системах запускайте с ionice -c3 (низкий приоритет I/O): ionice -c3 du -sh /var/*.
Внимание: удалённые файлы, занятые процессом
Если df показывает занятое место, а du — меньший объём, вероятно, файл удалён, но ещё открыт процессом. Найти такие файлы: lsof | grep deleted. Решение: перезапустить процесс, держащий файл открытым (например, ротация логов без reload демона).