Formula: Apa yang nomor?
total int = Jumlah (physical_blocks_in_use) * physical_block_size / ls_block_size) untuk setiap file.
Dimana:
ls_block_sizeadalah variabel lingkungan sewenang - wenang (biasanya 512 atau 1024 byte) yang dapat dimodifikasi secara bebas dengan
--block-size=<int>tanda aktif ls, POSIXLY_CORRECT=1variabel lingkungan GNU (untuk mendapatkan unit 512-byte), atau -kbendera untuk memaksa unit 1kB.
physical_block_sizeadalah 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 %Bnilai pada statatau 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 -smengembalikan 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 statkita melihat serangkaian nilai yang berbeda. Berjalan statdi 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:
statmelaporkan kedua physical_blocks_in_usedan physical_block_sizeseperti yang digunakan dalam rumus di atas. Perhatikan bahwa ini adalah nilai berdasarkan antarmuka OS.
dumenyediakan apa yang secara umum diterima sebagai perkiraan yang cukup akurat untuk pemanfaatan disk fisik.
Untuk referensi, berikut adalah ls -ldirektori 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 lspada sistem saya tidak menyebutkan garis itu, tetapiinfo coreutils lstidak. Bagaimana bisaman lsdaninfo coreutils lsada informasi berbeda tentang perintah yang sama? Mengapa tidaklsdidokumentasikan sekali saja? Memiliki dua dokumentasi berbeda untuk perintah yang sama sepertinya diatur untuk kegagalan.