Что это за «итог» в самой первой строке после 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
18

Просто упомяну - вы можете использовать -h (ls -lh), чтобы преобразовать это в удобочитаемый формат.

Цветомир Димитров
источник