Wie wird die unkomprimierte gesamte physische Größe einer HFS-komprimierten Datei oder eines HFS-komprimierten Verzeichnisses in Bytes angezeigt?

Wie wird die unkomprimierte gesamte physische Größe einer HFS-komprimierten Datei oder eines HFS-komprimierten Verzeichnisses in Bytes angezeigt?

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 -lerhalten 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 mdlsBefehl, der fehlerhaft ist und manchmal (null)den kMDItemPhysicalSizeSchlüssel zurückgibt, abgesehen davon, dass einige Benutzer Spotlight vollständig deaktiviert haben.

Antwort1

VerwendenafsctoolBefehl mit -vFlag, 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, afsctoolwurde aus macOS entfernt und dufunktioniert 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 ~.

verwandte Informationen