Formula: Apa yang nomor?
total int = Jumlah (physical_blocks_in_use) * physical_block_size / ls_block_size) untuk setiap file.
Dimana:
ls_block_size
adalah variabel lingkungan sewenang - wenang (biasanya 512 atau 1024 byte) yang dapat dimodifikasi secara bebas dengan
--block-size=<int>
tanda aktif ls
, POSIXLY_CORRECT=1
variabel lingkungan GNU (untuk mendapatkan unit 512-byte), atau -k
bendera untuk memaksa unit 1kB.
physical_block_size
adalah nilai tergantung OS dari antarmuka blok internal, yang mungkin atau mungkin tidak terhubung ke perangkat keras yang mendasarinya. Nilai ini biasanya 512b atau 1k, tetapi sepenuhnya tergantung pada OS. Itu bisa diungkapkan melalui %B
nilai pada stat
atau fstat
. Perhatikan bahwa nilai ini (hampir selalu) tidak terkait dengan jumlah blok fisik pada perangkat penyimpanan modern .
Kenapa begitu membingungkan?
Angka ini cukup terlepas dari metrik fisik atau bermakna. Banyak programmer junior belum memiliki pengalaman dengan lubang file atau tautan hard / sym . Selain itu, dokumentasi yang tersedia tentang topik khusus ini sebenarnya tidak ada.
Ketidakberpihakan dan ambiguitas dari istilah "ukuran blok" adalah akibat dari berbagai langkah yang mudah dikacaukan, dan tingkat abstraksi yang relatif dalam berkisar pada akses disk.
Contoh informasi yang saling bertentangan: du
(atau ls -s
) vs.stat
Menjalankan du *
dalam folder proyek menghasilkan yang berikut: (Catatan: ls -s
mengembalikan hasil yang sama.)
dactyl:~/p% du *
2 check.cc
2 check.h
1 DONE
3 Makefile
3 memory.cc
5 memory.h
26 p2
4 p2.cc
2 stack.cc
14 stack.h
Total : 2 + 2 + 1 + 3 + 3 + 5 + 26 + 4 + 2 + 14 = 62 Blok
Namun ketika seseorang berlari stat
kita melihat serangkaian nilai yang berbeda. Berjalan stat
di direktori yang sama menghasilkan:
dactyl:~/p% stat * --printf="%b\t(%B)\t%n: %s bytes\n"
3 (512) check.cc: 221 bytes
3 (512) check.h: 221 bytes
1 (512) DONE: 0 bytes
5 (512) Makefile: 980 bytes
6 (512) memory.cc: 2069 bytes
10 (512) memory.h: 4219 bytes
51 (512) p2: 24884 bytes
8 (512) p2.cc: 2586 bytes
3 (512) stack.cc: 334 bytes
28 (512) stack.h: 13028 bytes
Total: 3 + 3 + 1 + 5 + 6 + 10 + 51 + 8 + 3 + 28 = 118 Blok
Catatan: Anda dapat menggunakan perintah stat * --printf="%b\t(%B)\t%n: %s bytes\n"
> untuk menampilkan (dalam urutan) jumlah blok, (dalam parens) ukuran blok itu, nama file, dan ukuran dalam byte, seperti yang ditunjukkan di atas.
Ada dua hal penting yang harus diperhatikan:
stat
melaporkan kedua physical_blocks_in_use
dan physical_block_size
seperti yang digunakan dalam rumus di atas. Perhatikan bahwa ini adalah nilai berdasarkan antarmuka OS.
du
menyediakan apa yang secara umum diterima sebagai perkiraan yang cukup akurat untuk pemanfaatan disk fisik.
Untuk referensi, berikut adalah ls -l
direktori di atas:
dactyl:~/p% ls -l
**total 59**
-rw-r--r--. 1 dhs217 grad 221 Oct 16 2013 check.cc
-rw-r--r--. 1 dhs217 grad 221 Oct 16 2013 check.h
-rw-r--r--. 1 dhs217 grad 0 Oct 16 2013 DONE
-rw-r--r--. 1 dhs217 grad 980 Oct 16 2013 Makefile
-rw-r--r--. 1 dhs217 grad 2069 Oct 16 2013 memory.cc
-rw-r--r--. 1 dhs217 grad 4219 Oct 16 2013 memory.h
-rwxr-xr-x. 1 dhs217 grad 24884 Oct 18 2013 p2
-rw-r--r--. 1 dhs217 grad 2586 Oct 16 2013 p2.cc
-rw-r--r--. 1 dhs217 grad 334 Oct 16 2013 stack.cc
-rw-r--r--. 1 dhs217 grad 13028 Oct 16 2013 stack.h
man ls
pada sistem saya tidak menyebutkan garis itu, tetapiinfo coreutils ls
tidak. Bagaimana bisaman ls
daninfo coreutils ls
ada informasi berbeda tentang perintah yang sama? Mengapa tidakls
didokumentasikan sekali saja? Memiliki dua dokumentasi berbeda untuk perintah yang sama sepertinya diatur untuk kegagalan.