Ein typisches Beispiel: Apples TextEdit bei/Applications/TextEdit.app
Wenn Sie die physikalische Größe mit berechnen, echo "$(/usr/bin/du -k -d 0 /Applications/TextEdit.app | /usr/bin/awk '{print $1}') * 1024" | /usr/bin/bc -l
erhalten Sie (in meinem Fall am 10.11.6) eine Größe von4538368 Byte.
Wenn Sie jedoch das Infofenster im Finder öffnen, werden Sie darüber informiert, dass die physische Größe viel größer ist:8,6 MB auf der Festplatte, fast doppelt so groß.
Der Grund dafür ist klar: Apple verwendet HFS-Komprimierung für TextEdit. Das Ausführen des Drittanbieter-ToolsAbonnieren(das Sie mit Homebrew installieren können) erzeugt dieses Ergebnis:
/usr/local/bin/afsctool /Applications/TextEdit.app /Applications/TextEdit.app: Number of HFS+ compressed files: 693
Nun scheint macOS offensichtlich die unkomprimierte physische Größe zu kennen, wie der Wert „Size-on-Disk“ im Infofenster des Finders zeigt.
Meine Frage lautet nun, ob es eine schreibgeschützte Möglichkeit gibt, diese Informationen über die Befehlszeile abzurufen, d. h. eine Möglichkeit, Folgendes anzuzeigen:
a) dieunkomprimierte physikalische Größe(Festplattennutzung) einer Datei, die HFS-komprimiert ist, also einer Datei, die /usr/bin/stat -f %f
"32" zurückgibt (obwohl es in TextEdit aus irgendeinem Grund "524320" ist), und
b) dieunkomprimierte gesamte physikalische Größe(Festplattennutzung) eines Verzeichnisses oder Pakets, das HFS-komprimierte Dateien enthält.
Notiz:Zur Berechnung der Größe sollten nur native macOS-Befehle verwendet werden, währendnichtVerwenden von Spotlight-abhängigen Daten, z. B. aus dem mdls
Befehl, der fehlerhaft ist und manchmal (null)
den kMDItemPhysicalSize
Schlüssel zurückgibt, abgesehen davon, dass einige Benutzer Spotlight vollständig deaktiviert haben.
Antwort1
Verwendenafsctool
Befehl mit -v
Flag, zum Beispiel:
$ afsctool -v README
README:
File is HFS+ compressed.
File size (uncompressed data fork; reported size by Mac OS 10.6+ Finder): 3046 bytes / 3 KB (kilobytes) / 3 KiB (kibibytes)
File size (compressed data fork - decmpfs xattr; reported size by Mac OS 10.0-10.5 Finder): 0 bytes / 0 KB (kilobytes) / 0 KiB (kibibytes)
File size (compressed data fork): 1427 bytes / 1 KB (kilobytes) / 1 KiB (kibibytes)
Compression savings: 53.2%
Number of extended attributes: 0
Total size of extended attribute data: 0 bytes
Approximate overhead of extended attributes: 268 bytes
Approximate total file size (compressed data fork + EA + EA overhead + file overhead): 1943 bytes / 2 KB (kilobytes) / 2 KiB (kibibytes)
Antwort2
Nun, afsctool
wurde aus macOS entfernt und du
funktioniert auf ganzen Verzeichnissen:
% ditto -v --hfsCompression --arch arm64 /Volumes/Thunderbird/Thunderbird.app \
/Applications/Thunderbird\ BETA\ V.99.ARM64.app
Copying /Volumes/Thunderbird/Thunderbird.app [arm64]
% ditto -v --hfsCompression /Volumes/Thunderbird/Thunderbird.app
/Applications/Thunderbird\ BETA\ V.99.UNIVERSAL.app
Copying /Volumes/Thunderbird/Thunderbird.app
% du -sk /Applications/Thunderbird* /Volumes/Thunderbird/Thunderbird.app
352808 /Applications/Thunderbird BETA V.94.Universal.app
74832 /Applications/Thunderbird BETA V.99.ARM64.app
133152 /Applications/Thunderbird BETA V.99.UNIVERSAL.app
349184 /Applications/Thunderbird.app
349184 /Volumes/Thunderbird/Thunderbird.app
% du -skA /Applications/Thunderbird\ BETA\ V.99.*
207938 /Applications/Thunderbird BETA V.99.ARM64.app
348917 /Applications/Thunderbird BETA V.99.UNIVERSAL.app
%
Aus der Dokumentation:
du: -A
Zeigt die scheinbare Größe anstelle der Festplattennutzung an. Dies kann hilfreich sein, wenn komprimierte Datenträger oder Sparse-Dateien verwendet werden.
(Ich frage mich, warum und wann afsctool aus macOS entfernt wurde, ob es von einer alten Installation kopiert werden kann und ob es in Darwin enthalten ist.)
Oh, und was MDLS betrifft, funktioniert das mit dem Ruhezustand besser:
% cat /dev/urandom | head -c 5 > foo; sleep 3; mdls foo | grep ize
kMDItemFSSize = 5
kMDItemLogicalSize = 5
kMDItemPhysicalSize = 4096
Gegen
% cat /dev/urandom | head -c 2 > foo; mdls foo | grep ize
kMDItemFSSize = (null)
Außerdem hängt die Ausgabe vom aktuellen Verzeichnis ab; in /tmp verhält sie sich anders als in ~.