Hitung ukuran file rata-rata


11

Saya mencari satu-liner berguna untuk menghitung ukuran file rata-rata dalam direktori.

Yang saya inginkan adalah:

ukuran semua file / jumlah file dalam direktori


Seperti dalam ukuran rata-rata setiap file dalam direktori? atau ukuran direktori?
Drake Clarris

Ukuran rata-rata file dalam direktori
taffer

Jawaban:


3

Dengan FreeBSD / Mac OS X find, statdan awk(meskipun bukan one-liner yang praktis):

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

Perhatikan bahwa dalam -v var=value, awkakan memperluas urutan ANSI C sebagai \n, \r... Sementara kerang melakukan ekspor PWD, sehingga Anda dapat menggunakan ENVIRON["PWD"]di awkmana tidak memiliki jenis masalah bagi direktori memiliki backslashes di nama mereka.
Stéphane Chazelas

Jika Anda hanya perlu ukuran rata-rata dalam byte, Anda dapat menggunakannya find . -type f -exec stat -f%z {} +|awk '{s+=$0}END{print s/NR}'.
Lri

11

Dengan GNU temukan:

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

Atau untuk penggunaan disk:

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

Perhatikan bahwa jika ada beberapa hardlink dari file yang sama di sana, itu akan menghitung penggunaan disk-nya beberapa kali.

Di atas hanya menghitung file biasa, bukan symlinks atau direktori atau file khusus lainnya. Ini termasuk file tersembunyi.

Sama dengan zshbuiltin:

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

Solusi sederhana dalam satu baris:

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

Ini memiliki cheat sintaksis di dalamnya, hanya mempertimbangkan lsjalur output yang dimulai dengan '-', yang seharusnya merupakan data untuk file biasa.


2

hanya file dalam direktori, abaikan sub direktori:

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

Atau untuk menghitung semua file termasuk file dalam subdirektori:

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

Saya ingin tidak mengabaikan sub direktori.
taffer

bagus. Cukup tambahkan -k ke du doa untuk mendapatkan hasil dalam 1024bytes (kb) alih-alih 512bytes (ukuran default dari file chunk).
Olivier Dulac

2
du -sakan menambah penggunaan disk (bukan ukuran) dari semua file dan direktori serta file non-reguler lainnya , tidak termasuk tautan ekstra keras ke file yang sama, sementara findakan menghitung semua file biasa. Juga, nama file dengan karakter baris baru akan dihitung beberapa kali. du -Skhusus untuk GNU. du -sakan melaporkan sektor atau kilobyte tergantung pada OS.
Stéphane Chazelas

Seperti biasa @StephaneChazelas, pengetahuan Anda tentang linux / unix mengejutkan saya dan menunjukkan betapa kotornya solusi cepat dan kotor saya. Sudah berapa lama Anda menggunakan linux / unix?
Drake Clarris

Jawabannya sangat salah dan harus dihapus. Dijelaskan oleh Stephane.
Acumenus
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.