¿Cómo mostrar el tamaño físico total sin comprimir en bytes de un archivo o directorio comprimido con HFS?

¿Cómo mostrar el tamaño físico total sin comprimir en bytes de un archivo o directorio comprimido con HFS?

Caso en cuestión: TextEdit de Apple en/Applications/TextEdit.app

Si calcula el tamaño físico con echo "$(/usr/bin/du -k -d 0 /Applications/TextEdit.app | /usr/bin/awk '{print $1}') * 1024" | /usr/bin/bc -lobtendrá (en mi caso en 10.11.6) un tamaño de4538368 bytes.

Sin embargo, si abres la ventana Información en Finder, te dirá que el tamaño físico es mucho mayor:8,6 MB en disco, casi el doble de tamaño.

Está claro por qué: Apple usó compresión HFS en TextEdit. Ejecutando la herramienta de tercerosafsctool(que puedes instalar con Homebrew) produce este resultado:

/usr/local/bin/afsctool /Applications/TextEdit.app /Applications/TextEdit.app: Number of HFS+ compressed files: 693

Ahora, macOS obviamente parece conocer el tamaño físico sin comprimir, como lo demuestra el valor de tamaño en disco en la ventana de información del Finder.

Mi pregunta es si existe una forma de línea de comandos de solo lectura para obtener esa información, es decir, una forma de mostrar:

(a) eltamaño físico sin comprimir(uso de disco) de un archivo comprimido HFS, es decir, un archivo que /usr/bin/stat -f %fdevuelve "32" (aunque por alguna razón sea "524320" en TextEdit), y

(b) eltamaño físico total sin comprimir(uso de disco) de un directorio o paquete que contiene archivos comprimidos HFS.

Nota:solo se deben usar comandos nativos de macOS para calcular el tamaño, mientras quenousando datos dependientes de Spotlight, por ejemplo, del mdlscomando, que tiene errores y a veces devuelve (null)la kMDItemPhysicalSizeclave, aparte del hecho de que algunos usuarios han desactivado Spotlight por completo.

Respuesta1

Usarafsctoolcomando con -vbandera, por ejemplo:

$ 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)

Respuesta2

Bueno, afsctoolse eliminó de macOS y dufunciona en directorios completos:

  %  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
 % 

De la documentación:

du: -A muestra el tamaño aparente en lugar del uso del disco. Esto puede resultar útil cuando se opera con volúmenes comprimidos o archivos dispersos.

(Me pregunto por qué y cuándo se eliminó afsctool de macOS, si se puede copiar desde una instalación anterior y si está en Darwin).

Ah, y en cuanto a mdls, esto funciona mejor con el sueño:

% cat /dev/urandom | head -c 5 > foo; sleep 3; mdls foo | grep ize
kMDItemFSSize                          = 5
kMDItemLogicalSize                     = 5
kMDItemPhysicalSize                    = 4096

vs

% cat /dev/urandom | head -c 2 > foo; mdls foo | grep ize
kMDItemFSSize              = (null)

Además, la salida depende del directorio actual; actúa de manera diferente en /tmp vs ~.

información relacionada