Ini tampaknya bekerja dengan cukup baik:
find . -type f -print0 | xargs -0 ls -l | awk '{size[int(log($5)/log(2))]++}END{for (i in size) printf("%10d %3d\n", 2^i, size[i])}' | sort -n
Keluarannya terlihat seperti ini:
0 1
8 3
16 2
32 2
64 6
128 9
256 9
512 6
1024 8
2048 7
4096 38
8192 16
16384 12
32768 7
65536 3
131072 3
262144 3
524288 6
2097152 2
4194304 1
33554432 1
134217728 4
di mana angka di sebelah kiri adalah batas bawah rentang dari nilai tersebut hingga dua kali nilai tersebut dan angka di sebelah kanan adalah jumlah file dalam rentang tersebut.
Berdasarkan jawaban garyjohn, berikut ini adalah satu baris, yang juga memformat keluaran agar dapat dibaca manusia:
find . -type f -print0 | xargs -0 ls -l | awk '{ n=int(log($5)/log(2)); if (n<10) { n=10; } size[n]++ } END { for (i in size) printf("%d %d\n", 2^i, size[i]) }' | sort -n | awk 'function human(x) { x[1]/=1024; if (x[1]>=1024) { x[2]++; human(x) } } { a[1]=$1; a[2]=0; human(a); printf("%3d%s: %6d\n", a[1],substr("kMGTEPYZ",a[2]+1,1),$2) }'
Ini adalah versi yang diperluas:
find . -type f -print0 \
| xargs -0 ls -l \
| awk '{ n=int(log($5)/log(2)); \
if (n<10) n=10; \
size[n]++ } \
END { for (i in size) printf("%d %d\n", 2^i, size[i]) }' \
| sort -n \
| awk 'function human(x) { x[1]/=1024; \
if (x[1]>=1024) { x[2]++; \
human(x) } } \
{ a[1]=$1; \
a[2]=0; \
human(a); \
printf("%3d%s: %6d\n", a[1],substr("kMGTEPYZ",a[2]+1,1),$2) }'
Di awk
pertama Saya menentukan ukuran file minimum untuk mengumpulkan semua file kurang dari 1kb ke satu tempat. Di awk
kedua , fungsi human(x)
didefinisikan untuk membuat ukuran yang dapat dibaca manusia. Bagian ini didasarkan pada salah satu jawaban di sini:https://unix.stackexchange.com/questions/44040/a-standard-tool-to-convert-a-byte-count-into-human-kib-mib-etc -seperti-du-ls1
Output sampel terlihat seperti:
1k: 335
2k: 16
32k: 5
128k: 22
1M: 54
2M: 11
4M: 13
8M: 3
Coba ini:
find . -type f -exec ls -lh {} \; |
gawk '{match($5,/([0-9.]+)([A-Z]+)/,k); if(!k[2]){print "1K"} \
else{printf "%.0f%s\n",k[1],k[2]}}' |
sort | uniq -c | sort -hk 2
KELUARAN :
38 1K
14 2K
1 30K
2 62K
12 2M
2 3M
1 31M
1 46M
1 56M
1 75M
1 143M
1 191M
1 246M
1 7G
PENJELASAN :
-
find . -type f -exec ls -lh {} \;
:cukup sederhana, cari file di direktori saat ini dan jalankanls -lh
pada mereka -
match($5,/([0-9.]+)([A-Z]+)/,k);
:ini akan mengekstrak ukuran file, dan menyimpan setiap kecocokan ke dalam larikk
. -
if(!k[2]){print "1K"}
:jikak[2]
tidak ditentukan ukuran file adalah <1K. Karena saya membayangkan Anda tidak peduli dengan ukuran sekecil itu, skrip akan mencetak1K
untuk semua file yang ukurannya <=1K. -
else{printf "%.0f%s\n",k[1],k[2]}
:jika file lebih besar dari 1K, bulatkan ukuran file ke bilangan bulat terdekat dan cetak bersama pengubahnya (K,M, atau G). -
sort | uniq -c
:hitung kemunculan setiap baris (ukuran file) yang dicetak. -
sort -hk 2
:urutkan menurut bidang kedua dalam format yang dapat dibaca manusia. Lewat sini,7G
diurutkan setelah8M
.