Dựa trên câu trả lời của garyjohn, đây là một lớp lót, cũng định dạng đầu ra cho con người có thể đọc được:
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) }'
Đây là phiên bản mở rộng của nó:
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) }'
Trong lần đầu tiên, awk
tôi đã xác định kích thước tệp tối thiểu để thu thập tất cả các tệp nhỏ hơn 1kb đến một nơi. Trong phần hai awk
, hàm human(x)
được định nghĩa để tạo kích thước có thể đọc được. Phần này dựa trên một trong những câu trả lời ở đây: /unix/44040/a-stiteria-tool-to-convert-a-byte-count-into-human-kib-mib-etc -like-du-ls1
Đầu ra mẫu trông như sau:
1k: 335
2k: 16
32k: 5
128k: 22
1M: 54
2M: 11
4M: 13
8M: 3