Что это за «итог» в самой первой строке после ls -l? [закрыто]


132

Что на 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документы для coreutils часто более подробны, чем страницы руководства. Вот почему у них есть примечание в конце каждой страницы руководства, в котором вы можете найти более подробную информацию в разделе информации.
Mat

7
Ах. Я выполнил, info lsи он дал тот же результат, что и info coreutils ls. Что делает аргумент coreutils?
HelloGoodbye

46

Формула: что это за число?

total int = Сумма (physical_blocks_in_use) * physical_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) vsstat

Запуск 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 Отправил полный ответ, взгляните и дайте мне знать, проясняет ли это вопрос.
Дон Скотт

Это не так в Git bash для Windows.
thdoan

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.