Команда ls: Показать размер содержимого директории
Узнайте, почему ls показывает размер директории как 4K и как отображать реальный размер содержимого директории в Unix/Linux. Узнайте решение с помощью команды du для точного расчета размера директории.
Как использовать команду ls в Unix/Linux для отображения общего размера каталогов и их содержимого, а не просто размера самого каталога (обычно 4K)? Когда я запускаю ls, я вижу размеры каталогов, указанные как 4K, но мне нужно видеть фактический размер всех файлов внутри каждого каталога. Существует ли конкретный флаг или опция для ls, который будет показывать общий размер содержимого каталогов?
Команда ls в Unix/Linux не может отображать общий размер содержимого каталога с помощью какого-либо флага - она показывает только собственный размер каталога (обычно 4K), что представляет собой размер структуры inode, содержащей списки файлов, а не фактические данные внутри. Чтобы увидеть общий размер всех файлов внутри каталога, необходимо использовать команду du (disk usage), которая специально разработана для этой цели с такими опциями, как du -sh для вывода сводки по каталогам в удобном для чтения формате.
Содержание
- Понимание разницы между размером файла каталога и размером содержимого
- Почему
lsпоказывает размер каталога как 4K - Решение с помощью команды
du - Распространенные флаги
lsи их ограничения - Альтернативные методы расчета размера каталога
- Практические примеры и лучшие практики
Понимание разницы между размером файла каталога и размером содержимого
В системах Unix и Linux каталоги являются специальными файлами, которые содержат метаданные о файлах, которые они содержат, а не сами фактические файловые данные. Когда вы выполняете команду ls -l, вы видите размер этого файла метаданных, который обычно небольшой (4K в большинстве систем из-за размеров блоков файловой системы).
Как объясняется на Ask Ubuntu, “в Unix и Linux всё является файлом, и на самом деле каталог - это файл со списком связанных с ним файлов. Таким образом, stat и ls показывают размер этого специального файла, а не общий объём всех файлов, связанных с каталогом”.
Это фундаментальное различие объясняет, почему ls не может показать вам общий размер содержимого каталога - она не предназначена для агрегирования размеров всех файлов внутри структуры каталога.
Почему ls показывает размер каталога как 4K
Значение 4K, которое вы видите при выполнении ls -l для каталогов, представляет собой размер блока файловой системы, выделенный для хранения inode и метаданных каталога. Это не связано с фактическим размером содержимого файлов внутри каталога.
Согласно исследованиям с Unix & Linux Stack Exchange, команда ls “только перечисляет файлы в указанном каталоге”, и её вывод показывает “размер файлов в файловой системе, а не использование каталога”, как отмечено на Super User.
Это ограничение означает, что ls просто не может предоставить общий размер содержимого каталога с любой комбинацией флагов - она не предназначена для此类计算.
Решение с помощью команды du
Команда du (disk usage) специально разработана для расчета общего размера содержимого каталогов. Вот наиболее полезные опции:
Базовое использование du
du -sh /путь/к/каталогу- Показывает сводку по размеру каталога в удобном для чтения форматеdu -sh *- Показывает размеры всех элементов в текущем каталогеdu -sh */- Показывает размеры всех подкаталогов в текущем каталоге
Распространенные опции du
-sили--summarize- Отображает только итоговое значение для каждого аргумента-hили--human-readable- Выводит размеры в удобном для чтения формате (К, М, Г)-cили--total- Отображает общий итог--max-depth=N- Ограничивает обход каталога N уровнями вглубь
Как отмечено в руководстве Linuxize, “флаг -s означает ‘summary’ (сводка) и будет отображать только общий размер указанного каталога”.
Например:
# Показать общий размер текущего каталога
du -sh .
# Показать размеры всех подкаталогов
du -sh */
# Показать общий размер включая все подкаталоги рекурсивно
du -shc . | tail -1
Распространенные флаги ls и их ограничения
Хотя у ls есть много полезных флагов для вывода списка файлов, ни один из них не может показать общий размер содержимого каталогов:
| Флаг | Описание | Ограничение |
|---|---|---|
-l |
Длинный формат вывода | Показывает размер файла каталога (4K), а не размер содержимого |
-h |
Размеры в удобном для чтения формате | Для каталогов всё равно показывает 4K |
-s |
Показать выделенный размер | Показывает только размеры верхнего уровня, а не итоговые |
-k |
Показать размеры в килобайтах | Не меняет фундаментальное ограничение |
-R |
Рекурсивный вывод | Перечисляет файлы, но не вычисляет итоги |
Как упоминается на Stack Overflow, “флаг -s будет перечислять только элементы в верхнем уровне каталога” и “ls будет только перечислять файлы в указанном каталоге”.
Альтернативные методы расчета размера каталога
Хотя du является рекомендуемым инструментом, существуют альтернативные методы:
Использование find и awk
# Рассчитать общий размер всех файлов в каталоге
find . -type f -ls | awk '{sum += $7} END {print sum}'
Использование ncdu (ncurses disk usage)
# Интерактивный анализатор использования диска
ncdu /путь/к/каталогу
Использование tree с расчетами размеров
# Сначала установите tree, если он недоступен
# tree -h --du
Практические примеры и лучшие практики
Распространенные сценарии
-
Проверить размер текущего каталога:
bashdu -sh . -
Сравнить размеры каталогов:
bashdu -sh */ | sort -hr -
Найти крупнейшие каталоги:
bashdu -sh ./* | sort -hr | head -10 -
Мониторить изменения размеров каталогов:
bash# До операции du -sh /var/log > /tmp/size_before.txt # После операции du -sh /var/log > /tmp/size_after.txt # Сравнить diff /tmp/size_before.txt /tmp/size_after.txt
Лучшие практики
- Используйте
du -shдля быстрой проверки размеров каталогов - Используйте
du -shc | tail -1для рекурсивных итогов - Для больших деревьев каталогов рассмотрите использование
ncduдля интерактивного исследования - Помните, что
duсчитает выделенные блоки, а не фактические размеры файлов, что может вызывать незначительные расхождения
Как отмечено на Super User, могут быть различия в выводе ls и du, потому что “du показывает общее использование объекта файловой системы”, в то время как ls показывает размеры отдельных файлов.
Заключение
-
lsне может показать общий размер содержимого каталога - Командаlsв своей основе предназначена для перечисления файлов и показа размеров отдельных файлов, а не для вычисления итогов по содержимому каталогов. Её вывод размера каталога (обычно 4K) представляет размер файла метаданных, а не фактический размер данных. -
Используйте
duдля расчетов размеров каталогов - Командаduявляется правильным инструментом для этой цели, при этомdu -shявляется наиболее распространенной комбинацией для вывода сводок по каталогам в удобном для чтения формате. -
Понимайте разницу в концепциях - Размер файла каталога против размера содержимого каталога является фундаментальной концепцией в файловых системах Unix/Linux. Знание этой разницы помогает выбрать правильную команду для правильной задачи.
-
Изучайте опции
du- Помимо базового использования,duпредлагает множество опций, таких как--max-depth,--excludeи--timeдля более сложного анализа размеров.
Если вам часто приходится анализировать размеры каталогов, рассмотрите установку ncdu - интерактивного анализатора использования диска, который предоставляет обратную связь в реальном времени при навигации по структурам каталогов.