Как Linux вычисляет общее количество блоков при запуске / bin / ls -l?

Я пытаюсь выяснить, как программа /bin/ls -l вычисляет общий размер (количество блоков) для каталога. Под этим я подразумеваю total number вывода, которое оно печатает прямо перед содержимым каталога.

Здесь есть аналогичный вопрос: https://stackoverflow.com/questions/7401704/what-is-that-total-in-the-very-first-line-after-ls-l, но он не полностью отвечает вопрос и не объяснять, как именно он рассчитывается.

Я попытался добавить числа блоков 512B, выделенных для всех (не скрытых) файлов в каталоге. Вот как я пытаюсь это сделать (в C):

  int getBlockSize(char* directory) { int size = 0; DIR *d; struct dirent *dir; struct stat fileStat; d = opendir(directory); if (d) { while ((dir = readdir(d)) != NULL) { if (dir->d_name[0] != '.') { // Ignore hidden files // Create the path to stat char info_path[PATH_MAX + 1]; strcpy(info_path, directory); if (directory[strlen(directory) - 1] != '/') strcat(info_path, "/"); strcat(info_path, dir->d_name); stat(info_path, &fileStat); size += fileStat.st_blocks; } } } return size; } 

Однако это дает мне совсем другое число по сравнению с командой ls .

Что «неправильно» с моим подходом? Как вычислить общее количество?

Редактировать:

Для проверки я создал папку, содержащую файлы test_file1.txt и test_file2.txt каждая из которых содержит текст Hello World! , Когда я запускаю ls -l я получаю следующий вывод:

 total 1 -rw-------. 1 aaa111 ugrad 13 Oct 27 13:17 test_file1.txt -rw-------. 1 aaa111 ugrad 13 Oct 27 13:17 test_file2.txt 

Однако, когда я запускаю свой код с помощью метода выше, я получаю

 total 2 -rw-------. 1 aaa111 ugrad 13 Oct 27 13:17 test_file1.txt -rw-------. 1 aaa111 ugrad 13 Oct 27 13:17 test_file2.txt 

One Solution collect form web for “Как Linux вычисляет общее количество блоков при запуске / bin / ls -l?”

По умолчанию ls для Linux представляет общую строку в 1K блоках, поэтому ваш результат правильный, так как вы считаете 512-байтные блоки.

Вы можете заставить ls рассчитывать в 512-байтовых блоках с помощью POSIXLY_CORRECT :

 POSIXLY_CORRECT=1 ls -l 
  • Что это значит, когда вывод $ ls -lasrt включает в себя '.' а также '..'
  • Как найти и распечатать конкретные пути к файлам с исключениями?
  • Как wc -l `ls` дает фактическое количество строк?
  • Почему новый каталог имеет жесткое количество ссылок 2, прежде чем что-либо добавится к нему?
  • Просмотреть расширенный ACL для файла с '+' в ls -l output
  • Можно ли отображать содержимое каталога без его изменения?
  • Опция ls -e недоступна в linux
  • stat: время печати в формате «long-iso»
  • zsh псевдоним переопределяется каким-то образом
  • Как найти общий размер файла, сгруппированный по расширению
  • Как узнать, перенаправляется ли выход в файл?
  • Создание текстового файла списка записей в каталоге в корзине
  • Interesting Posts

    Лучший способ поддержания точности часов в LInux

    Какой самый простой способ составить список наиболее распространенных слов в списке?

    Получить числовое значение chmod для файла

    awk – объединить два фильтра в один

    Идентификатор файла, который не изменяется при переименовании

    исходный файл с ключами и значениями и использовать его в perl-коде

    Создание нового раздела с разделенным для нового жесткого диска: при установке он намного меньше, чем ожидалось. Зачем?

    Как показать на рабочем столе предупреждающее сообщение

    Кран Touchpad не работает Fedora WS24 на ноутбуке Toshiba

    Как обновить PHP с 5.4.16 до> = PHP 5.6.5 / PHP 7 на Centos 7?

    Удалять повторяющиеся строки попарно?

    Подключение через telnet и выполнение определенных операций

    Какие из следующих файлов являются истинными сиротскими (потерянными) файлами и могут быть безопасно удалены?

    Загрузка из командной строки GRUB, говорит, что partion не существует

    Терминал Ubuntu – переход к позиции курсора мыши

    Linux и Unix - лучшая ОС в мире.