Estoy tratando de descubrir cómo el programa /bin/ls -l
calcula el tamaño total (recuento de bloques) de un directorio. Con esto me refiero a la salida que imprime justo antes del contenido del directorio.total number
Hay una pregunta similar aquí:https://stackoverflow.com/questions/7401704/what-is-that-total-in-the-very-first-line-after-ls-lpero no responde completamente a la pregunta ni explica exactamente cómo se calcula.
Intenté agregar elnúmeros de bloques 512B asignados para todos los archivos (no ocultos) en un directorio. Así es como intento hacerlo (en 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;
}
Sin embargo, esto me da un número muy diferente en comparación con el ls
comando.
¿Qué hay de malo en mi enfoque? ¿Cómo se ls
calcula el total?
Editar:
Para probar, hice una carpeta que contiene archivos test_file1.txt
y test_file2.txt
cada uno contiene el texto Hello World!
. Cuando lo ejecuto ls -l
obtengo el siguiente resultado
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
Sin embargo, cuando ejecuto mi código usando el método anterior obtengo
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
Respuesta1
En Ubuntu, el valor predeterminado ls
esÑUls
, cualpor defecto el tamaño de bloque es de 1024 bytespara su línea “total”. Esto explica la diferencia en el resultado entre ls
su enfoque y su enfoque: su enfoque muestra el doble de bloques porque cuenta bloques de 512 bytes.
Hay varias formas de obligar a GNU ls
a contar en bloques de 512 bytes (consulte el enlace de arriba); lo más confiable es configurar LS_BLOCK_SIZE
:
LS_BLOCK_SIZE=512 ls -l
La otra implementación ls
que probablemente encontrará en Linux esCaja ocupada ls
; también utiliza un tamaño de bloque de 1024 bytes para la línea "total" y no se puede configurar para utilizar ningún otro tamaño.