Що таке "загальний" в першому рядку після ls -l? [зачинено]


131

Що є totalна виході ls -l?

    $ ls -l /etc
    total 3344
    -rw-r--r--   1 root root   15276 Oct  5  2004 a2ps.cfg
    -rw-r--r--   1 root root    2562 Oct  5  2004 a2ps-site.cfg
    drwxr-xr-x   4 root root    4096 Feb  2  2007 acpi
    -rw-r--r--   1 root root      48 Feb  8  2008 adjtime
    drwxr-xr-x   4 root root    4096 Feb  2  2007 alchemist

Відповіді:


94

Ви можете знайти визначення цього рядка в lsдокументації для вашої платформи. Для coreutils ls(той, який знайдено у багатьох системах Linux), інформацію можна знайти за допомогою info coreutils ls:

Для кожного каталогу, що перерахований, передмовте файли рядком `total BLOCKS ', де BLOCKS - загальний розподіл диска для всіх файлів у цьому каталозі.


14
Як не дивно, man lsв моїй системі ця лінія не згадується, але є info coreutils ls. Як з'являється man lsта info coreutils lsмають різну інформацію про одну команду? Чому це не lsпросто задокументовано один раз? Наявність двох різних документацій для однієї команди, схоже, налаштована на збій.
HelloGoodbye

1
infoДокументи для основних матеріалів часто детальніше, ніж довідкові сторінки. Ось чому вони мають примітку в кінці кожної чоловічої сторінки, яка посилається на вас в інформаційний розділ для отримання більш детальної інформації.
Мат

7
Ага. Я виконав info lsі це, щоб дати той же вихід, що і info coreutils ls. Що робить аргумент coreutils?
HelloGoodbye

46

Формула: Що таке , що число?

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

26

Це загальна кількість блоків файлової системи, включаючи непрямі блоки, використовувані переліченими файлами. Якщо ви працюєте ls -sна одних і тих же файлах і підсумовуєте звітні номери, ви отримаєте те саме число.


Це просто неправда. Приклад: /bin/ls -s-> total 15 2 filename 3 filename2 3 filename3 3 filename4 2 filename5 2 filename6 2 filename8 2 filename9
Дон Скотт

3
Я не знаю , яку систему ви, але для мене це є правдою. Приклад: gist.github.com/rfjakob/200f6001bf91cf801891
Jakob

@Jakob Опублікував повну відповідь, погляньте і повідомте мені, якщо це очистить її.
Дон Скотт

Це не вірно в Git bash для Windows.
1717

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.