Как показать общий физический размер в байтах несжатого файла или каталога, сжатого HFS?

Как показать общий физический размер в байтах несжатого файла или каталога, сжатого HFS?

Показательный пример: TextEdit от Apple/Applications/TextEdit.app

Если вы рассчитаете физический размер, то echo "$(/usr/bin/du -k -d 0 /Applications/TextEdit.app | /usr/bin/awk '{print $1}') * 1024" | /usr/bin/bc -lполучите (в моем случае на 10.11.6) размер4538368 байт.

Однако если вы откроете окно «Информация» в Finder, то увидите, что физический размер намного больше:8,6 МБ на диске, почти вдвое больше.

Понятно почему: Apple использовала сжатие HFS в TextEdit. Запуск стороннего инструментаafsctool(который можно установить с помощью Homebrew) дает следующий результат:

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

Очевидно, что macOS знает несжатый физический размер, о чем свидетельствует значение размера на диске в окне «Информация» Finder.

Мой вопрос в том, есть ли способ получить эту информацию только для чтения из командной строки, то есть способ показать:

(а)несжатый физический размер(использование диска) файла, сжатого HFS, т.е. файла, для которого /usr/bin/stat -f %fвозвращается "32" (хотя по какой-то причине в TextEdit это "524320"), и

(б)общий физический размер в несжатом виде(использование диска) каталога или пакета, содержащего сжатые файлы HFS.

Примечание:Для расчета размера следует использовать только собственные команды macOS, в то время какнетс использованием зависящих от Spotlight данных, например, из mdlsкоманды, которая глючит и иногда возвращает (null)ключ kMDItemPhysicalSize, помимо того факта, что некоторые пользователи вообще отключили Spotlight.

решение1

Использоватьafsctoolкоманда с -vфлагом, например:

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

решение2

Ну, afsctoolбыл удален из macOS и duработает для целых каталогов:

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

Из документации:

du: -A Отображение видимого размера вместо использования диска. Это может быть полезно при работе со сжатыми томами или разреженными файлами

(Интересно, почему и когда afsctool был удален из macOS, можно ли его скопировать из старой установки и есть ли он в Darwin.)

О, и что касается mdls, это лучше работает со сном:

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

против

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

Кроме того, вывод зависит от текущего каталога; он действует по-разному в /tmp и ~.

Связанный контент