Unterschied bei der Berechnung der Verzeichnisgröße

9

Ich muss die Größe des Verzeichnisses im Terminal zum Signieren erhalten. Ich benutze folgenden Befehl:

du -s /path/to/dir

Ich multipliziere das Ergebnis mit der herkömmlichen UNIX-Blockgröße (512 Bytes) und erhalte die tatsächliche Verzeichnisgröße in Bytes. Das Dialogfeld "Get Info" des Finders zeigt jedoch die Größe an, die geringfügig kleiner ist als die mit dem Terminalbefehl berechnete. Und es scheint, dass es auf jedem Ordner / Bundle reproduzierbar ist. Was vermisse ich?

Eimantas
quelle

Antworten:

11

duZeigt normalerweise Informationen zur Festplattennutzung an (daher kommt der Name). Denk daran, dass

disk usage != sum of file sizes

Weil jede Datei eine Reihe von Blöcken im Dateisystem einnimmt (siehe man mkfs.ext2zum Beispiel). Dies bedeutet, dass nur in einer sehr seltenen Situation die Festplattennutzung einer Datei ihrer tatsächlichen Größe entspricht - dafür muss die Größe genau ein Vielfaches der Blockgröße sein.

Stellen Sie sich Dateisystemblöcke als Felder vor, die Teile von Dateien enthalten - jeder kann nur einen Teil einer Datei enthalten.

duÜberprüfen Sie für die GNU-Version von die --apparent-sizeOption.


Eine noch interessantere Situation kann eintreten, wenn sich einige spärliche Dateien im Dateisystem befinden!

rozcietrzewiacz
quelle
Es gibt keine solche Option (ich bin unter OS X, nicht unter Linux). Wahrscheinlich musste das in einer Frage erwähnt werden, da Tag nicht genug ist.)
Eimantas
Ah, richtig ... Dann schauen Sie sich die Manpage an und versuchen Sie, Verweise auf actualoder zu finden apparent. (Siehe auch meine aktualisierte Erklärung).
Rozcietrzewiacz
2
Richtig bis auf die Ungleichung. Die Dateigrößen sind manchmal größer als der tatsächliche Speicherplatz, der zum Speichern benötigt wird. ( unix.stackexchange.com/q/33801/9426 )
Stéphane Gimenez
@ StéphaneGimenez Wow ... danke, dass du es mir erzählt hast!
Rozcietrzewiacz
2

Über Mac OS X und den Finder (in Snow Leopard, Version 10.6.8) ist mir Folgendes aufgefallen.

  • Ich erhalte die Byteanzahl für die 'quantifizierten' Zahlen des Finders eines Pfads (Datei oder Ordner) mit dem folgenden Code (in bash(1)).
  • Das Finder "Info" -Fenster und -Fenster zeigt die "quantifizierten" (z. B. Kilo in KB) Zahlen in Dezimalbytes (Basis 10, 1000) im Gegensatz zu den Binärbytes (Basis 2, 1024), also "quantifiziere" ich durch Teilen durch 1000 und Erhöhen des Einheitspräfixes (Byte) 'Quantifizierer' (Größe) und einige ungerade "Off-Key" -Rundungen. (Mein vollständiger Code ist voll von auskommentiertem Entwicklungscode und in mehrere Dateien (und Sprachen) unterteilt, so dass es schwierig ist, ihn zu teilen.)
    Soweit ich gesehen habe, sind meine "quantifizierten" Zahlen dieselben wie die "quantifizierten" Zahlen im Finder .
  • Außerdem möchte ich zusammen mit dem Code sagen, dass ich keine (und noch nie eine) Umgebungsvariable BLOCKSIZEin meiner Shell festgelegt habe, aber ich habe (jetzt ein wenig) beide Versionen getestet und die Standardwerte für $BLOCKSIZEergeben dieselben Werte.

#!/usr/bin/env bash
#tab-width:4
                                 du -s                      "${@:-.}"   |awk '{u+=$1}END{   print  u*'${BLOCKSIZE:-0512}'   }'||exit $?         #macosx  (xnu)
#                               gdu -sB${BLOCKSIZE:-4096}   "${@:-.}"   |awk '{u+=$1}END{   print  u*'${BLOCKSIZE:-4096}'   }'||exit $?         #macports gnu

  • Die nicht quantifizierte Nummer, mit der ich nicht übereinstimmen konnte.
    Das einzige, was ich sagen kann, ist, dass ich näher komme, indem ich nur Dateien zähle (also Verzeichnis ~ 'Dateisystem-Metaindex / Header' ~ Daten ausschließt) und dass das, was ich am nächsten bekomme, das Folgende ist.

#!/usr/bin/env bash
#tab-width:4
    for a;do find "$a" -type f -print0|xargs -0      stat -f %z         |awk '{u+=$1}END{   print  u                        }'||exit $?;done    #macosx  (xnu)
#   for a;do find "$a" -type f -print0|xargs -0     gstat -c %s         |awk '{u+=$1}END{   print  u                        }'||exit $?;done    #macports gnu
  • Weder (xnu) du(1) noch (gnu) gdu(1) scheinen erweiterte Attribute zu zählen ( xattr)

Und dann muss ich nur pun ‚Run den Pfad und die Mathematik‘
Frieden und gute Nacht diesmal fo'real.

vike
quelle
1

Auf meinem Ubuntu-System du -b filegibt die Verwendung von ext4 die Größe einer tatsächlichen Datei in Byte und du -b dirdie Größe der Datei (en) + Verzeichnis-Overhead in Byte an. In meinem Fall beträgt der Overhead ein Vielfaches von 4096 Byte.

Dieser Overhead steigt mit zunehmender Anzahl von Dateien.
Hinweis: Auch wenn Dateien gelöscht werden, bleibt der Verzeichnis-Overhead auf der höheren Ebene, auf der er sich vor dem Löschen der Dateien befand.

Ich habe nicht versucht, einen Neustart durchzuführen, um festzustellen, ob er zurückgesetzt wird. In beiden Fällen bedeutet dies jedoch, dass die Verzeichnisgröße abhängig von den historischen Umständen variiert.

Das Zählen jeder Dateigröße ist möglicherweise die beste Option für einen genauen Wert der gesamten Dateigröße .

Das folgende Skript summiert alle Dateigrößen (in Bytes).

Wenn Sie unter OS X nicht die -bOption für 'du' haben, können Sie statstattdessen verwenden. (Wenn Sie diese haben :) ... Die kommentierte Zeile zeigt die Ubuntu- statAlternative zu du -b;

unset total
while IFS= read -r -d $'\0' rf; do
  # (( total += $(stat  "$rf" | sed -nre 's/^  Size: ([0-9]+).*/\1/p') ))
    (( total += $(du -b "$rf" | cut -f 1) ))
done < <(find  . -type f  -name '*' -print0)
echo $total
Peter.O
quelle
2
OSX hat nichtdu -b und eine anderestat . Ihr Skript ist in keiner Weise außerhalb von Linux portierbar.
Gilles 'SO - hör auf böse zu sein'
Mit MacPorts unter OS X können Sie installieren coreutils, um die GNU-Version von duas zu erhalten gdu. Es ist also nicht gerade portabel, kann aber für Benutzer unter OS X nützlich sein, um die GNU-Versionen einiger Kern-Utils zu erhalten.
Drfrogsplat
1

Summiere alle Dateien in einem Verzeichnis:

OSX: find dir ! -type d -print0 | xargs -0 stat -f '%z' | awk '{sum += $1} END{print sum}'

Linux: find dir ! -type d -printf "%s\n" | awk '{sum += $1} END{print sum}'

Christian
quelle