Вычислить средний размер файла


11

Я ищу удобный однострочник для вычисления среднего размера файла в каталоге.

Что я хочу это:

размер всех файлов / количество файлов в каталоге


Как в среднем размере каждого файла в каталоге? или размер каталога?
Дрейк Кларрис

Средний размер файла в директории
taffer

Ответы:


3

С FreeBSD / Mac OS X find, statи awk(не совсем удобным однострочником , хотя):

find -x . -type f -maxdepth 1 -exec sh -c 'stat -f '%z' "${@}"' _ '{}' + | 
LC_ALL=C awk -v pwd="${PWD}" '
   BEGIN{ sum=0; count=0; }
   { sum+=$1; ++count; }
   END{ 
        if (count == 0) exit;
        printf ("number of files: %d\n", count); 
        printf ("average file size in B: %.5f\n", sum/count); 
        printf ("average file size in KB: %.5f\n", (sum/count) / 1024); 
        printf ("average file size in MB: %.5f\n", (sum/count) / (1024*1024)); 
        printf ("directory: %s\n", pwd); 
   }
'

Обратите внимание, что in -v var=value, awkбудет расширять последовательности ANSI C следующим образом \n: \r... Хотя оболочки и экспортируют PWD, так что вы можете использовать, ENVIRON["PWD"]в awkкоторых нет такой проблемы, для каталогов, имеющих обратную косую черту в имени.
Стефан Шазелас

Если вам просто нужен средний размер в байтах, вы можете использовать find . -type f -exec stat -f%z {} +|awk '{s+=$0}END{print s/NR}'.
Lri

11

С помощью GNU найдите:

find . -type f -printf '%s\n' | awk '{s+=$0}
  END {printf "Count: %u\nAverage size: %.2f\n", NR, s/NR}'

Или для использования диска:

find . -type f -printf '%k\n' | awk '{s+=$0}
  END {printf "Count: %u\nAverage size: %.2f\n", NR, s*1024/NR}'

Обратите внимание, что если там есть несколько жестких ссылок одного и того же файла, это будет учитывать его использование диска несколько раз.

Выше указано только обычные файлы, а не символические ссылки или каталоги или другие специальные файлы. Включает скрытые файлы.

То же самое со zshвстроенными:

zmodload -i zsh/stat
count() {zstat -Hs -- $REPLY; ((size+=$s[size], count++, 0))}
size=0 count=0
**/*(oNDN.+count)
print -f "Count: %s\nAverage size: %.2f\n" $count $(($size./count))

3

Упрощенное решение в одну строку:

ls -Rl -- "$DIR" | awk 'BEGIN{sum=0;count=0};/^-/{sum+=$5;++count};END{print sum/count}'

Он содержит синтаксический чит в нем, рассматривая только lsстроки вывода, начинающиеся с '-', которые должны составлять данные для обычных файлов.


2

только для файлов в каталоге, игнорируя подкаталоги:

expr $(du -Ss | cut -f1) / $(find /path/to/dir -maxdepth 1 -type f | wc -l)

Или подсчитать все файлы, включая файлы в подкаталогах:

expr $(du -s | cut -f1) / $(find /path/to/dir -type f | wc -l)

Я хотел бы не игнорировать подкаталоги.
Таффер

отлично. Просто добавьте -k к вызову du, чтобы получить результат в 1024 байта (КБ) вместо 512 байтов (размер по умолчанию для фрагмента файла).
Оливье Дюлак

2
du -sбудет сложить использование дискового пространства (не размер) все файлы и каталоги и других нерегулярных файлы , за исключением дополнительных жестких ссылок на тот же файл, в то время как findбудет считать все регулярные файлы. Кроме того, имена файлов с символами новой строки будут учитываться несколько раз. du -Sявляется специфическим для GNU. du -sбудет сообщать сектора или килобайты в зависимости от ОС.
Стефан Шазелас

Как обычно @StephaneChazelas, ваши знания linux / unix поражают меня и показывают, насколько грязны мои быстрые и грязные решения. Как долго вы используете Linux / Unix?
Дрейк Кларрис

Ответ ужасно неправильный и должен быть удален. Объяснил Стефан.
Acumenus
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.