Linux 在运行 /bin/ls -l 时如何计算总块数?

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

我的方法有什么“问题”?ls总数如何计算?

编辑:

为了测试,我创建了一个包含文件的文件夹test_file1.txttest_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值为GNUls, 哪个默认为 1024 字节块大小其“总”线。这解释了您的方法与您的方法之间的输出差异ls:您的方法显示的块数是双倍的,因为它计算的是 512 字节块。

有多种方法可以强制 GNUls以 512 字节块计数(请参阅上面的链接);最可靠的是设置LS_BLOCK_SIZE

LS_BLOCK_SIZE=512 ls -l

ls您在 Linux 上可能遇到的另一个实现是忙碌盒 ls;它还对“total”行使用 1024 字节的块大小,并且不能配置为使用任何其他大小。

相关内容