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

У меня есть каталог и несколько таких подкаталогов: - directory1 (sub-dir1, sub-dir2, sub -dir3, sub-dir4, sub-dir5 ........... и так далее, их сотни ...)

Как узнать средний размер подкаталогов? А как узнать максимальный размер подкаталогов?

Все с использованием команд Unix ...

Спасибо.


person Mircea    schedule 10.03.2010    source источник
comment
Что вы имеете в виду под максимальным размером подкаталогов? Вы имеете в виду размер самого большого подкаталога?   -  person Thomas    schedule 10.03.2010
comment
Использование команд Unix означает, что это не связано с программированием. Голосование за переход на суперпользователя.   -  person David Thornley    schedule 10.03.2010
comment
Переход на суперпользователя - это нормально.   -  person Mircea    schedule 10.03.2010


Ответы (3)


Если у вас есть только каталоги, а не файлы в directory1, то следующие две «команды» должны дать вам размер (в байтах) и имя самого большого каталога и средний их размер (в байтах), соответственно.

$ du -sb directory1/* | sort -n | tail -n 1
$ du -sb directory1/* | awk ' { sum+=$1; ++n } END { print sum/n } '

Если в directory1 есть также обычные файлы, они также будут учитываться в приведенных выше примерах. Если обычные файлы не следует считать, может быть более подходящим следующее.

$ find directory1/ -mindepth 1 -maxdepth 1 -type d -exec du -sb {} \; | sort -n | tail -n 1
$ find directory1/ -mindepth 1 -maxdepth 1 -type d -exec du -sb {} \; | awk ' { sum+=$1; ++n } END { print sum/n } '
person Mikael Auno    schedule 10.03.2010
comment
Вторая команда дает мне средний размер в КБ? (первый, насколько я понимаю, дает мне это в байтах, верно) - person Mircea; 10.03.2010
comment
@Mircea Все размеры указаны в байтах, это то, что делает флаг -b для du. Если вместо этого вам нужны размеры в КиБ, замените -b на -k. - person Mikael Auno; 10.03.2010
comment
Ну, для первой команды (используя ее с -b) я получаю максимальный размер, например 9893072, который, я думаю, это 9893 килобайт, а не килобит, верно?). Если я запущу его с -k, я получу 992 (килобайт или килобит?) Какой из них правильный? Вторая команда дает мне 960 (в среднем), когда я запускаю ее с -b. 960 байт ?? Это невозможно, я знаю, что все подкаталоги внутри содержат более 960 байт. - person Mircea; 10.03.2010
comment
И как я могу исключить определенные подкаталоги из подсчета? - person Mircea; 10.03.2010
comment
@Mircea Я сделал небольшую ошибку. sort должен быть добавлен -n (как я сделал сейчас в ответе выше), чтобы сортировка выполнялась численно, а не лексикографически. Также обратите внимание, что -k дает размеры в килобайтах, а не в килобайтах. Один КиБ равен 1024 байтам, один КБайт равен 1000 байтам. - person Mikael Auno; 10.03.2010
comment
@Mircea Вы можете добавить аргументы в find, чтобы отфильтровать нужные вам подкаталоги. См. Справочную страницу для find(1) для получения более подробной информации. - person Mikael Auno; 10.03.2010
comment
Я думал 1 байт = 8 бит .. не правда ли? - person Mircea; 11.03.2010
comment
@Mircea 1 байт = 8 бит, 1 КиБ (кибибайт, что обычно означает, когда говорят килобайт) = 1024 байта, 1 КБ (килобайт) = 1000 байт. - person Mikael Auno; 11.03.2010
comment
Я посмотрел, как использовать find для удаления определенных подкаталогов ... но я не понимаю, как объединить это с помощью первой команды: du -sb directory / * | sort -n | хвост -n 1 - person Mircea; 11.03.2010
comment
@Mircea Вы собрали это вместе с моим последним примером, в котором фактически используется find. Если вам, например, нужны только подкаталоги, в именах которых есть слово foo, добавьте -name "*foo*" после -type d (что указывает на то, что это должен быть каталог). - person Mikael Auno; 11.03.2010
comment
Хорошо, для первой команды я использовал это (я не знаю, насколько она эффективна, но похоже, что она выполняет свою работу): du -sk directory1 / * | sort -n | grep -v 'sub-dir1' | grep -v 'sub-dir2' | grep -v 'sub-dir3' | tail -n 1 Для второй команды я использовал это: du -sk directory1 / * | grep -v 'sub-dir1' | grep -v 'sub-dir2' | grep -v 'sub-dir3' | awk '{сумма + = 1 доллар; ++ n} END {вывод суммы / n; print n} 'Результат - 1779.92 и 957 ... Я полагаю, 957 - это фактический результат, верно? - person Mircea; 11.03.2010
comment
@Mircea Теперь я вижу, что сделал еще одну ошибку: вторая строка вывода из awk была предназначена только для моего тестирования, когда я писал эту строку. Он просто выводит количество файлов, учитываемых в среднем (просто удалите часть print n, чтобы избавиться от этого). Таким образом, средний размер составляет 1780 КиБ или 1,74 МиБ (если вы имели в виду, что 1779,92 и 957 выводятся второй командой). - person Mikael Auno; 11.03.2010
comment
@Mircea Хороший способ сказать спасибо в Stack Overflow - это принять ответы, которые, по вашему мнению, являются ответами на ваши вопросы. - person Mikael Auno; 12.03.2010

Однажды у меня была проблема с ext3, которая допускает только 31998 подкаталогов на каталог. Ext4 позволяет ~ 64к.

person whiskeysierra    schedule 10.03.2010
comment
У меня в каталоге не более 1000 подкаталогов, так что это не проблема. - person Mircea; 10.03.2010

чтобы получить наибольший размер (КБ), используйте -b для байтов

du -sk */|sort -n|tail -1

получить средний размер (КБ)

du -sk */|awk '{s+=$1}END{print s/NR}'
person ghostdog74    schedule 11.03.2010
comment
Разве awk не побеждает цель использования только команд unix? Я имею в виду, конечно, это один, но Perl тоже - person swampsjohn; 12.03.2010
comment
я не понимаю, что ты говоришь. любые инструменты / программы, которые могут быть выполнены в командной строке, технически являются командой unix ... однако в традиционном смысле, до появления таких языков, как Perl / Python, эти команды (например, du / awk и т. д.) уже являются частью unix. До сегодняшнего дня я все еще различал их как команды unix (как в спецификациях Single unix), в отличие от вызова Perl / Python как команд unix. - person ghostdog74; 12.03.2010
comment
Но awk - это язык программирования. Это полный Тьюринг. - person swampsjohn; 13.03.2010
comment
да так? Я все еще не понимаю твоей точки зрения. awk - это язык программирования, но у него нет библиотек / модулей для поиска использования диска (также известного как du). - person ghostdog74; 13.03.2010