Обчислити середній розмір файлу


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); 
   }
'

Зауважте, що в -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}'.
Лрі

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)

Я хотів би не ігнорувати підкаталоги.
taffer

приємно. Просто додайте -k до виклику du, щоб результат мав 1024 байт (кб) замість 512 байт (розмір файлу за замовчуванням).
Олів'є Дулак

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

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

Відповідь жахливо неправильна і її слід видалити. Пояснив Стефан.
Акумен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.