Saya mencari satu-liner berguna untuk menghitung ukuran file rata-rata dalam direktori.
Yang saya inginkan adalah:
ukuran semua file / jumlah file dalam direktori
Saya mencari satu-liner berguna untuk menghitung ukuran file rata-rata dalam direktori.
Yang saya inginkan adalah:
ukuran semua file / jumlah file dalam direktori
Jawaban:
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);
}
'
-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.
find . -type f -exec stat -f%z {} +|awk '{s+=$0}END{print s/NR}'.
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))
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.
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)
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.