du
Размер файлов и директорий — детальный анализ использования дискового пространства
Описание
du (disk usage) — утилита для вычисления реального дискового пространства, занятого файлами и директориями. В отличие от df, которая работает на уровне файловых систем, du рекурсивно обходит указанные пути и суммирует размеры файлов. Это позволяет точно определить, какие директории «съели» место на диске.
du показывает выделенное дисковое пространство (disk blocks), а не логический размер файлов. Разреженные файлы (sparse files) могут занимать меньше места на диске, чем показывает ls -l. Размер блока по умолчанию зависит от настроек системы, поэтому всегда используйте флаг -h или -b для предсказуемого вывода.
Используйте du, когда нужно найти «тяжёлые» директории: после алерта от df о заполнении диска, при планировании архивирования, для анализа роста логов или кэша. Команда du -sh * | sort -rh | head -20 — одна из самых полезных однострочных команд в арсенале администратора.
Синтаксис
Без аргументов du обходит текущую директорию рекурсивно. Можно указать один или несколько путей.
Вывод по умолчанию — размер в блоках 1024 байт и путь:
Флаги и опции
| Флаг | Описание |
|---|---|
-h | Human-readable: размеры в K, M, G, T (степени 1024). Обязательный флаг для чтения вручную |
-s | Summary: показать только итог для каждого аргумента (не рекурсивно). Часто используется вместе с -h |
-a | All: показать размер для каждого файла, не только директорий |
-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 | head -20 — универсальный способ быстро найти «виновника» заполненного диска. Запускайте в директории, на которую указывает df, и постепенно спускайтесь вглубь дерева директорий.
Утилита
ncdu (установить: sudo apt install ncdu) предоставляет интерактивный ncurses-интерфейс для навигации по дереву директорий с сортировкой по размеру. Гораздо удобнее для интерактивного исследования, чем цепочки du | sort.
Запуск
du -sh / на заполненном сервере может занять несколько минут и создать нагрузку на I/O. На продакшн-системах запускайте с ionice -c3 (низкий приоритет I/O): ionice -c3 du -sh /var/*.
Если
df показывает занятое место, а du — меньший объём, вероятно, файл удалён, но ещё открыт процессом. Найти такие файлы: lsof | grep deleted. Решение: перезапустить процесс, держащий файл открытым (например, ротация логов без reload демона).