Я пытаюсь понять, как программа /bin/ls -l
вычисляет общий размер (количество блоков) для каталога. Под этим я подразумеваю вывод, который она печатает прямо перед содержимым каталога.total number
Похожий вопрос есть и здесь:https://stackoverflow.com/questions/7401704/что-это-всего-в-первой-строке-после-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
командой.
Что 'не так' с моим подходом? Как 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
решение1
В Ubuntu по умолчанию ls
используетсяГНУls
, которыйпо умолчанию размер блока составляет 1024 байтадля его строки «всего». Это объясняет разницу в выводе между ls
и вашим подходом: ваш подход показывает вдвое больше блоков, потому что он считает блоки по 512 байт.
Существуют различные способы заставить GNU ls
вести подсчет блоками по 512 байт (см. ссылку выше); наиболее надежный — установить LS_BLOCK_SIZE
:
LS_BLOCK_SIZE=512 ls -l
Другая реализация, с ls
которой вы, вероятно, столкнетесь в Linux, — этоBusyBox ls
; он также использует размер блока 1024 байта для строки «total», и его нельзя настроить на использование какого-либо другого размера.