Saya punya sistem file yang memiliki beberapa juta file dan saya ingin melihat distribusi ukuran file secara rekursif di direktori tertentu. Aku merasa ini benar-benar bisa dilakukan dengan beberapa bash / awk fu, tetapi bisa menggunakan tangan. Pada dasarnya saya ingin sesuatu seperti yang berikut:
1KB: 4123
2KB: 1920
4KB: 112
...
4MB: 238
8MB: 328
16MB: 29138
Count: 320403345
Saya merasa seperti ini seharusnya tidak terlalu buruk diberikan loop dan beberapa file kondisional log2 bersyarat foo, tapi saya sepertinya tidak bisa sampai di sana.
Pertanyaan Terkait: Bagaimana saya bisa menemukan file yang lebih besar / lebih kecil dari x byte? .
linux
command-line
bash
unix
notpeter
sumber
sumber
ls
ke afind
. Aku meletakkannya kembali seperti semula.xargs
secara signifikan lebih cepat daripada-exec
, jadi saya menggunakan metode itu.Berdasarkan jawaban garyjohn, ini adalah one-liner, yang juga memformat output menjadi dapat dibaca manusia:
Ini adalah versi yang diperluas:
Pada bagian pertama
awk
saya mendefinisikan ukuran file minimum untuk mengumpulkan semua file kurang dari 1kb ke satu tempat. Dalam yang keduaawk
, fungsihuman(x)
didefinisikan untuk membuat ukuran yang dapat dibaca manusia. Bagian ini didasarkan pada salah satu jawaban di sini: /unix/44040/a-standard-tool-to-convert-a-byte-count-into-human-kib-mib-etc -seperti du-ls1Output sampel terlihat seperti:
sumber
Coba ini:
OUTPUT:
PENJELASAN:
find . -type f -exec ls -lh {} \;
: cukup sederhana, cari file dalam direktori saat ini dan jalankanls -lh
di dalamnyamatch($5,/([0-9.]+)([A-Z]+)/,k);
: ini akan mengekstraksi ukuran file, dan menyimpan setiap kecocokan ke dalam arrayk
.if(!k[2]){print "1K"}
: jikak[2]
tidak terdefinisi 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 integer terdekat dan cetak bersama dengan modifikasinya (K, M, atau G).sort | uniq -c
: hitung kemunculan setiap baris (ukuran file) yang dicetak.sort -hk 2
: urutkan berdasarkan bidang kedua dalam format yang dapat dibaca manusia. Dengan cara ini,7G
diurutkan setelahnya8M
.sumber