Что это за "итог" в первой строке после ls -l?

Что такое "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

Ответ 1

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

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

Ответ 2

Формула: что это за номер?

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, чтобы заставить 1kB.
  • physical_block_size - зависимое от ОС значение внутреннего интерфейса блока, которое может быть или не быть подключено к базовому оборудованию. Это значение обычно равно 512b или 1k, но полностью зависит от ОС. Он может быть обнаружен с помощью значения %B на stat или fstat. Обратите внимание, что это значение (почти всегда) не связано с количеством физических блоков на современном устройстве хранения.

Почему так запутанно?

Этот номер довольно удален от любой физической или значимой метрики. Многие младшие программисты не имели опыта работы с файловыми отверстиями или жесткими/символическими ссылками. Кроме того, документация, доступная по этой конкретной теме, практически не существует.

Неравномерность и двусмысленность термина "размер блока" была результатом множества различных мер, которые легко путают, и относительно глубоких уровней абстракции, вращающихся вокруг доступа к диску.

Примеры конфликтной информации: du (или ls -s) vs 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

Ответ 3

Это общее количество блоков файловой системы, включая косвенные блоки, используемые указанными файлами. Если вы запустите ls -s в тех же файлах и суммируете сообщенные номера, вы получите тот же номер.

Ответ 4

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