我试图弄清楚程序如何/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.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
值为GNUls
, 哪个默认为 1024 字节块大小其“总”线。这解释了您的方法与您的方法之间的输出差异ls
:您的方法显示的块数是双倍的,因为它计算的是 512 字节块。
有多种方法可以强制 GNUls
以 512 字节块计数(请参阅上面的链接);最可靠的是设置LS_BLOCK_SIZE
:
LS_BLOCK_SIZE=512 ls -l
ls
您在 Linux 上可能遇到的另一个实现是忙碌盒 ls
;它还对“total”行使用 1024 字节的块大小,并且不能配置为使用任何其他大小。