Was ist diese "Summe" in der allerersten Zeile nach ls -l? [geschlossen]

131

Was ist das totalin der Ausgabe von ls -l?

    $ ls -l /etc
    total 3344
    -rw-r--r--   1 root root   15276 Oct  5  2004 a2ps.cfg
    -rw-r--r--   1 root root    2562 Oct  5  2004 a2ps-site.cfg
    drwxr-xr-x   4 root root    4096 Feb  2  2007 acpi
    -rw-r--r--   1 root root      48 Feb  8  2008 adjtime
    drwxr-xr-x   4 root root    4096 Feb  2  2007 alchemist
Sanket Sahu
quelle

Antworten:

94

Die Definition dieser Zeile finden Sie in der lsDokumentation zu Ihrer Plattform. Für coreutils ls(die auf vielen Linux-Systemen gefunden werden) können die Informationen gefunden werden über info coreutils ls:

Stellen Sie den Dateien für jedes aufgelistete Verzeichnis eine Zeile "total BLOCKS" voran, wobei BLOCKS die gesamte Festplattenzuordnung für alle Dateien in diesem Verzeichnis ist.

Matte
quelle
14
Lustigerweise erwähnt man lsmein System diese Zeile nicht, info coreutils lstut es aber . Wie kommt man lsund info coreutils lsverschiedene Informationen über den gleichen Befehl hat? Warum wird nicht lsnur einmal dokumentiert? Zwei verschiedene Dokumentationen für denselben Befehl zu haben, scheint für einen Fehler eingerichtet zu sein.
HelloGoodbye
1
infoDokumente für Coreutils sind oft detaillierter als die Manpages. Aus diesem Grund befindet sich am Ende jeder Manpage ein Hinweis, der Sie auf den Infobereich verweist, um weitere Informationen zu erhalten.
Mat
7
Ah. Ich habe ausgeführt info lsund es gibt die gleiche Ausgabe wie info coreutils ls. Was macht das Argument coreutils?
HelloGoodbye
46

Die Formel: Was ist diese Zahl?

total int = Summe von (Physical_blocks_in_use) * Physical_block_size / ls_block_size) für jede Datei.

Wo:

  • ls_block_sizeist ein willkürlicher Umgebungsvariable ( in der Regel 512 oder 1024 Bytes) , die mit der frei modifizierbar ist --block-size=<int>Flagge auf lsdem, POSIXLY_CORRECT=1GNU - Umgebungsvariable (um 512-Byte - Einheiten) oder die -kMarkierung zu zwingen 1kB Einheiten.
  • physical_block_sizeist der betriebssystemabhängige Wert einer internen Blockschnittstelle, die mit der zugrunde liegenden Hardware verbunden sein kann oder nicht. Dieser Wert beträgt normalerweise 512b oder 1k, ist jedoch vollständig vom Betriebssystem abhängig. Es kann durch den %BWert auf statoder angezeigt werden fstat. Beachten Sie, dass dieser Wert (fast immer) nicht mit der Anzahl der physischen Blöcke auf einem modernen Speichergerät zusammenhängt.

Warum so verwirrend?

Diese Zahl ist ziemlich weit von jeder physischen oder aussagekräftigen Metrik entfernt. Viele Junior-Programmierer haben keine Erfahrung mit Dateilöchern oder Hard / Sym-Links . Darüber hinaus ist die zu diesem speziellen Thema verfügbare Dokumentation praktisch nicht vorhanden.

Die Disjunktheit und Mehrdeutigkeit des Begriffs "Blockgröße" ist das Ergebnis zahlreicher verschiedener Maßnahmen, die leicht verwechselt werden können, und der relativ tiefen Abstraktionsebenen, die sich um den Festplattenzugriff drehen.

Beispiele für widersprüchliche Informationen: du(oder ls -s) vs.stat

Das Ausführen du *in einem Projektordner führt zu folgenden Ergebnissen : (Hinweis: ls -sGibt dieselben Ergebnisse zurück.)

dactyl:~/p% du *
2       check.cc
2       check.h
1       DONE
3       Makefile
3       memory.cc
5       memory.h
26      p2
4       p2.cc
2       stack.cc
14      stack.h

Gesamt : 2 + 2 + 1 + 3 + 3 + 5 + 26 + 4 + 2 + 14 = 62 Blöcke

Wenn man jedoch läuft stat, sehen wir einen anderen Satz von Werten. Das Ausführen statim selben Verzeichnis ergibt:

dactyl:~/p% stat * --printf="%b\t(%B)\t%n: %s bytes\n"
3       (512)   check.cc: 221 bytes
3       (512)   check.h: 221 bytes
1       (512)   DONE: 0 bytes
5       (512)   Makefile: 980 bytes
6       (512)   memory.cc: 2069 bytes
10      (512)   memory.h: 4219 bytes
51      (512)   p2: 24884 bytes
8       (512)   p2.cc: 2586 bytes
3       (512)   stack.cc: 334 bytes
28      (512)   stack.h: 13028 bytes

Gesamt: 3 + 3 + 1 + 5 + 6 + 10 + 51 + 8 + 3 + 28 = 118 Blöcke

Hinweis: Mit dem Befehl stat * --printf="%b\t(%B)\t%n: %s bytes\n"> können Sie (in der Reihenfolge) die Anzahl der Blöcke, (in Parens) die Größe dieser Blöcke, den Namen der Datei und die Größe in Bytes ausgeben, wie oben gezeigt.

Es gibt zwei wichtige Dinge zum Mitnehmen:

  • statBerichte sowohl das physical_blocks_in_useund physical_block_sizewie in der Formel oben. Beachten Sie, dass dies Werte sind, die auf Betriebssystemschnittstellen basieren.
  • duliefert eine allgemein akzeptierte Schätzung der physischen Festplattenauslastung.

Als Referenz ist hier das ls -lVerzeichnis von oben:

dactyl:~/p% ls -l
**total 59**
-rw-r--r--. 1 dhs217 grad   221 Oct 16  2013 check.cc
-rw-r--r--. 1 dhs217 grad   221 Oct 16  2013 check.h
-rw-r--r--. 1 dhs217 grad     0 Oct 16  2013 DONE
-rw-r--r--. 1 dhs217 grad   980 Oct 16  2013 Makefile
-rw-r--r--. 1 dhs217 grad  2069 Oct 16  2013 memory.cc
-rw-r--r--. 1 dhs217 grad  4219 Oct 16  2013 memory.h
-rwxr-xr-x. 1 dhs217 grad 24884 Oct 18  2013 p2
-rw-r--r--. 1 dhs217 grad  2586 Oct 16  2013 p2.cc
-rw-r--r--. 1 dhs217 grad   334 Oct 16  2013 stack.cc
-rw-r--r--. 1 dhs217 grad 13028 Oct 16  2013 stack.h
Don Scott
quelle
26

Dies ist die Gesamtzahl der Dateisystemblöcke, einschließlich der indirekten Blöcke, die von den aufgelisteten Dateien verwendet werden. Wenn Sie ls -smit denselben Dateien arbeiten und die gemeldeten Zahlen summieren, erhalten Sie dieselbe Zahl.

Dave Lasley
quelle
Das ist einfach nicht wahr. Beispiel: /bin/ls -s-> total 15 2 filename 3 filename2 3 filename3 3 filename4 2 filename5 2 filename6 2 filename8 2 filename9
Don Scott
3
Ich weiß nicht , welches System Sie sind auf, aber für mich, es ist wahr. Beispiel: gist.github.com/rfjakob/200f6001bf91cf801891
Jakob
@Jakob Hat eine vollständige Antwort gepostet, sieh sie dir an und lass es mich wissen, wenn das klärt.
Don Scott
Dies gilt nicht für Git Bash für Windows.
30.
18

Nur um zu erwähnen - Sie können -h (ls -lh) verwenden, um dies in ein für Menschen lesbares Format zu konvertieren.

Tsvetomir Dimitrov
quelle