HFS 圧縮ファイルまたはディレクトリの非圧縮合計物理サイズをバイト単位で表示するにはどうすればよいですか?

HFS 圧縮ファイルまたはディレクトリの非圧縮合計物理サイズをバイト単位で表示するにはどうすればよいですか?

一例として、AppleのTextEditは/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 MBほぼ2倍の大きさになります。

理由は明らかです。AppleはTextEditでHFS圧縮を使用していました。サードパーティのツールを実行するとafscツール(Homebrew でインストールできます) は次の結果を生成します:

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

現在、macOS は明らかに、Finder の情報ウィンドウのディスク上のサイズの値からわかるように、圧縮されていない物理サイズを認識しているようです。

私の質問は、その情報を取得するためのコマンドライン読み取り専用の方法、つまり以下を表示する方法があるかどうかです。

(a)非圧縮物理サイズHFS圧縮されたファイル、つまり「32」を返すファイル/usr/bin/stat -f %f(何らかの理由でTextEditでは「524320」であるにもかかわらず)の(ディスク使用)

(b)圧縮されていない合計物理サイズ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

さて、afsctoolmacOS から削除され、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 に関しては、これは sleep と一緒に使用するとより効果的です:

% 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 と ~ では動作が異なります。

関連情報