Ich versuche herauszufinden, wie das Programm /bin/ls -l
die Gesamtgröße (Blockanzahl) eines Verzeichnisses berechnet. Damit meine ich die Ausgabe, die es direkt vor dem Verzeichnisinhalt ausgibt.total number
Eine ähnliche Frage gibt es hier:https://stackoverflow.com/questions/7401704/was-ist-das-insgesamt-in-der-allerersten-zeile-nach-ls-lEs beantwortet die Frage jedoch nicht vollständig und erklärt auch nicht genau, wie es berechnet wird.
Ich habe versucht, dieAnzahl der zugewiesenen 512B-Blöcke für alle (nicht versteckten) Dateien in einem Verzeichnis. So versuche ich es (in 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;
}
Allerdings erhalte ich dadurch im Vergleich zum ls
Befehl eine ganz andere Zahl.
Was ist an meinem Ansatz „falsch“? Wie ls
berechnet man die Gesamtsumme?
Bearbeiten:
Zum Testen habe ich einen Ordner erstellt, der Dateien enthält test_file1.txt
, die test_file2.txt
jeweils den Text enthalten Hello World!
. Wenn ich ihn ausführe, ls -l
erhalte ich die folgende Ausgabe
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
Wenn ich meinen Code jedoch mit der obigen Methode ausführe, erhalte ich
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
Antwort1
Unter Ubuntu ls
ist die StandardeinstellungGNUls
, welchestandardmäßig 1024-Byte-Blockgrößefür die Zeile „total“. Dies erklärt den Unterschied in der Ausgabe zwischen ls
und Ihrem Ansatz: Ihr Ansatz zeigt die doppelte Anzahl von Blöcken an, da er 512-Byte-Blöcke zählt.
Es gibt verschiedene Möglichkeiten, GNU ls
zum Zählen in 512-Byte-Blöcken zu zwingen (siehe Link oben). Am zuverlässigsten ist die Einstellung LS_BLOCK_SIZE
:
LS_BLOCK_SIZE=512 ls -l
Die andere Implementierung, ls
die Sie unter Linux wahrscheinlich antreffen werden, istBusyBox ls
; es verwendet auch eine Blockgröße von 1024 Byte für die Zeile „total“ und kann nicht für die Verwendung einer anderen Größe konfiguriert werden.