Формула: Що таке , що число?
total int = Сума (phys_blocks_in_use) * phys_block_size / ls_block_size) для кожного файлу.
Де:
ls_block_size
це довільна змінна середовище (як правило, 512 або 1024 байти), яка вільно змінюється при включеному
--block-size=<int>
прапорі ls
, POSIXLY_CORRECT=1
змінної середовища GNU (щоб отримати 512-байтові одиниці) або -k
прапорі, щоб примусити одиниці 1 кБ.
physical_block_size
- залежне від ОС значення інтерфейсу внутрішнього блоку, який може бути або не може бути підключений до базового обладнання. Це значення зазвичай 512b або 1k, але повністю залежить від ОС. Це можна виявити через %B
значення на stat
або fstat
. Зауважте, що це значення (майже завжди) не пов'язане з кількістю фізичних блоків на сучасному пристрої зберігання даних.
Чому так заплутано?
Ця цифра досить відокремлена від будь-якої фізичної чи значущої метрики. Багато молодших програмістів не мали досвіду роботи з файловими отворами або жорсткими / сим-посиланнями . Крім того, наявної документації з цієї конкретної теми практично не існує.
Невдоволеність і неоднозначність терміна "розмір блоку" була наслідком того, що численні різні заходи легко сплутати, і відносно глибокі рівні абстракції, що обертаються навколо доступу до диска.
Приклади конфліктної інформації: du
(або ls -s
) протиstat
Запуск du *
у папці проекту дає наступне: (Примітка: ls -s
повертає ті самі результати.)
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
Разом : 2 + 2 + 1 + 3 + 3 + 5 + 26 + 4 + 2 + 14 = 62 блоки
Однак, коли людина працює, stat
ми бачимо інший набір значень. Запуск stat
у тому ж каталозі дає вихід:
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
Разом: 3 + 3 + 1 + 5 + 6 + 10 + 51 + 8 + 3 + 28 = 118 блоків
Примітка. Ви можете скористатися командою stat * --printf="%b\t(%B)\t%n: %s bytes\n"
> для виведення (по порядку) кількості блоків (у паренах) розміру цих блоків, імені файлу та розміру в байтах, як показано вище.
Є дві важливі речі:
stat
звіти як physical_blocks_in_use
і physical_block_size
як використані у формулі вище. Зауважте, що це значення, засновані на інтерфейсах ОС.
du
надає те, що загальноприйнято як досить точну оцінку використання фізичного диска.
Для довідки, ось наведений ls -l
вище каталог:
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
в моїй системі ця лінія не згадується, але єinfo coreutils ls
. Як з'являєтьсяman ls
таinfo coreutils ls
мають різну інформацію про одну команду? Чому це неls
просто задокументовано один раз? Наявність двох різних документацій для однієї команди, схоже, налаштована на збій.