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

taffer
sumber
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); 
   }
'
Turid
sumber
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))
Stéphane Chazelas
sumber
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.

Bruce Ediger
sumber
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)
Drake Clarris
sumber
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