Как узнать фактический размер каталога, используя стандартные инструменты UNIX / Linux?
Альтернативный вопрос: как мне заставить du показывать мне фактический размер каталога (не использование диска)?
Поскольку люди, похоже, имеют разные определения термина «размер»: мое определение «размера каталога» является суммой всех обычных файлов в этом каталоге.
Меня НЕ волнует размер inode каталога или что-либо еще (блоки * размер блока), которые файлы занимают в соответствующей файловой системе. Каталог с 3 файлами по 1 байту каждый имеет размер каталога 3 байта (по моему определению).
Расчет размера каталога с использованием du кажется ненадежным.
Например, mkdir foo && du -b foo
сообщает «4096 foo», 4096 байт вместо 0 байт. При очень больших каталогах размер каталога, о котором сообщается, du -hs
может быть отключен на 100 ГБ (!) И более (сжатая файловая система).
Так что (инструмент / опция) нужно использовать, чтобы получить фактический размер каталога?
xfs
случайно?Ответы:
Вот скрипт, отображающий читаемый человеком размер каталога с использованием стандартных инструментов Unix (POSIX).
например:
источник
ls
заклинаниях здесь:-q
. Без этой опции скрипт сломается, если какое-либо имя файла будет содержать символы новой строки. Написание действительно надежных сценариев оболочки слишком сложно…Некоторые версии
du
поддерживают аргумент,--apparent-size
показывающий видимый размер вместо использования диска. Итак, ваша команда будет:Из справочных страниц для du, включенных в Ubuntu 12.04 LTS:
источник
Просто альтернатива, используя
ls
:ls -nR
:-n
like-l
, но перечисляет числовые UID и GID и-R
рекурсивно перечисляет подкаталоги.grep -v:
Инвертируйте смысл соответствия, чтобы выбрать несовпадающие строки. (-v определяется POSIX.)'^ d'
исключит каталоги.Команда Ls: http://linux.about.com/od/commands/l/blcmdl1_ls.htm
Man Grep: http://linux.die.net/man/1/grep
РЕДАКТИРОВАТЬ :
Отредактировано как предложение @ Сергей Власов.
источник
-n
параметраls
вместо вместо-l
(показывать номера UID / GID вместо имен) более безопасно, поскольку имена пользователей и групп могут содержать пробелы (например, еслиwinbind
илиsssd
используется для присоединения системы к домену Windows, вы можете получить такие имена групп, какdomain users
) , Это также должно быть быстрее из-за отсутствия необходимости поиска имен пользователей и групп.Предполагая, что у вас есть
du
из GNU coreutils, эта команда должна вычислить полный кажущийся размер произвольного числа обычных файлов в каталоге без каких-либо произвольных ограничений на количество файлов:Добавьте эту
-l
опцию,du
если внутри есть несколько жестко связанных файлов, и вы хотите считать каждую жесткую ссылку отдельно (по умолчаниюdu
несколько жестких ссылок учитываются только один раз).Самым важным отличием от plain
du -sb
является то, что рекурсивdu
также учитывает размеры каталогов, о которых разные файловые системы сообщают по-разному; чтобы избежать этого,find
команда используется для передачи только обычных файловdu
. Другое отличие состоит в том, что символические ссылки игнорируются (если они должны быть подсчитаны,find
команда должна быть скорректирована).Эта команда также будет потреблять больше памяти , чем обычный
du -sb
, потому что с помощью--files0-from=FILE
делаетdu
магазин устройства и номера индексных дескрипторов из всех обработанных файлов, в отличие от поведения по умолчанию запоминания только файлы с более чем одной жесткой ссылки. (Это не проблема, если эта-l
опция используется для подсчета жестких ссылок несколько раз, потому что единственная причина для хранения номеров устройств и индексов заключается в пропуске файлов с жесткими ссылками, которые уже были обработаны.)Если вы хотите получить удобочитаемое представление общего размера, просто добавьте
-h
опцию (это работает, потому чтоdu
вызывается только один раз и вычисляет сам общий размер, в отличие от некоторых других предлагаемых ответов):или (если вы беспокоитесь о том, что некоторые эффекты
-b
затем отменяются-h
)источник
-b
вероятно, его можно заменить на-A -B 1
, его эквивалента нет--files0-from=-
, и для использованияxargs
потребуются некоторые обходные пути в случае, если список файлов большеARG_MAX
(и какое-то внешнее решение для удобочитаемого вывода).Если вам нужен только размер файлов, исключая пространство, занимаемое каталогами, вы можете сделать что-то вроде
@SergeyVlasov отметил, что это не удастся, если у вас есть больше файлов, чем
argmax
. Чтобы избежать этого, вы можете использовать что-то вроде:источник
xargs
будет вызыватьсяdu
несколько раз, и каждый вызов будет выводить общую сумму только для его части из полного списка файлов, а затемtail
покажет только общий размер последней части.