Antworten:
Die Verwendung von stracescheint darauf hinzudeuten, dass die Dateigrößen tatsächlich berechnet werden, indem die Dateien im Verzeichnis abgefragt werden.
Sagen wir ich fülle ein Verzeichnis mit 3 1MB Dateien.
$ mkdir adir
$ fallocate -l 1M adir/afile1.txt
$ fallocate -l 1M adir/afile2.txt
$ fallocate -l 1M adir/afile3.txt
Wenn wir nun den du -hBefehl verfolgen :
$ strace -s 2000 -o du.log du -h adir/
3.1M adir/
Betrachten Sie die resultierende straceProtokolldatei du.log:
...
newfstatat(AT_FDCWD, "adir/", {st_mode=S_IFDIR|0775, st_size=4096, ...}, AT_SYMLINK_NOFOLLOW) = 0
fcntl(3, F_DUPFD, 3) = 4
fcntl(4, F_GETFD) = 0
fcntl(4, F_SETFD, FD_CLOEXEC) = 0
getdents(3, /* 5 entries */, 32768) = 144
getdents(3, /* 0 entries */, 32768) = 0
close(3) = 0
newfstatat(4, "afile2.txt", {st_mode=S_IFREG|0644, st_size=1048576, ...}, AT_SYMLINK_NOFOLLOW) = 0
newfstatat(4, "afile3.txt", {st_mode=S_IFREG|0644, st_size=1048576, ...}, AT_SYMLINK_NOFOLLOW) = 0
newfstatat(4, "afile1.txt", {st_mode=S_IFREG|0644, st_size=1048576, ...}, AT_SYMLINK_NOFOLLOW) = 0
brk(0) = 0x231a000
...
Beachten Sie die newfstatatSystemaufrufe? Diese erhalten der Reihe nach die Größe jeder Datei.
Wenn Sie interessiert sind, hier ist ein bisschen mehr zu diesem Thema.
Der statBefehl bietet keine Möglichkeit, etwas anderes als die Größe eines Dateisystemobjekts (Verzeichnis oder Datei) abzufragen.
$ stat adir/
File: ‘adir/’
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fd02h/64770d Inode: 11539929 Links: 2
Access: (0775/drwxrwxr-x) Uid: ( 1000/ saml) Gid: ( 1000/ saml)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2014-04-15 22:29:25.289639888 -0400
Modify: 2014-04-15 22:29:44.977638542 -0400
Change: 2014-04-15 22:29:44.977638542 -0400
Birth: -
Beachten Sie, dass es 4096 Bytes ist. Das ist die tatsächliche Größe des Verzeichnisses selbst, nicht was es enthält.
statEs gibt einfach keine Möglichkeit, mehrere Größen zurückzugeben. Daher kann nur die Größe des Verzeichnisses selbst zurückgegeben werden , nicht der Inhalt. Und auch "Verzeichnisgröße einschließlich Inhalt" wird weniger klar, wenn Sie Dateien fest verknüpft haben.
dusich sofort anfühlt, liegt es daran, dass die Dateien vom Kernel zwischengespeichert werden. Sie können dies sehen, wenn Sie versuchen, es mehrmals auf einem kürzlich gemounteten Dateisystem auszuführen - nach dem ersten Ausführen ist es viel schneller.