Antworten:
Die Verwendung von strace
scheint 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 -h
Befehl verfolgen :
$ strace -s 2000 -o du.log du -h adir/
3.1M adir/
Betrachten Sie die resultierende strace
Protokolldatei 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 newfstatat
Systemaufrufe? Diese erhalten der Reihe nach die Größe jeder Datei.
Wenn Sie interessiert sind, hier ist ein bisschen mehr zu diesem Thema.
Der stat
Befehl 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.
stat
Es 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.
du
sich 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.