現象
過去記事にも書いたように、私はCoherence XというツールでChromeを独自にアプリ化したものを多用しています。
しかし、Macのシステム設定 > 一般 > ストレージでサイズの大きいアプリケーションのリストを表示すると、その大半がCoherence Xでだいぶ前にこしらえたアプリたちで占められていました。長年使っている間にアプリが肥大化しているようです。
サイズの大きさが目に余るので、アプリをターミナルでこじ開けてdu -sh *|sort -hrでサイズを調べ、キャッシュなどの影響のなさそうなファイルをギガ単位で捨てました。
Profile/の下にある以下のディレクトリの内容Cache/*Code Cache/*
duでチェックすると、アプリのサイズは確かに7.05GBから1.0GBまで減少しています。
$ du -sh TechRacho.app
1.0G TechRacho.app
しかし「情報を見る」でチェックしたアプリのサイズはほとんど減っていませんでした(アプリの状態によっては期待通り減っていることもありましたが)。
ファイル容量はたしかに減ったのに、Finderの容量表示や「情報を見る」で認識されていない様子です。
lipoも試してみた
Coherence Xのアプリがユニバーサルバイナリだからファイル容量が倍になっているのかと思い、lipoコマンドでx86_64バイナリを削減したりもしましたが、それでもFinderや「情報を見る」のファイル容量が減りませんでした🤔
# 確認
lipo -info Techracho.app/Contents/MacOS/Techracho
#> Architectures in the fat file: Techracho.app/Contents/MacOS/Techracho are: x86_64 arm64
# arm64バイナリに差し替え
lipo Techracho.app/Contents/MacOS/Techracho -thin arm64 -output Techracho_arm64
mv Techracho.app/Contents/MacOS/Techracho Techracho.app/Contents/MacOS/Techracho.bak
mv Techracho_arm64 Techracho.app/Contents/MacOS/Techracho
# 確認
lipo -info Techracho.app/Contents/MacOS/Techracho
#> Non-fat file: Techracho.app/Contents/MacOS/Techracho is architecture: arm64
参考: lipo Man Page - macOS - SS64.com
解決方法
ChatGPTとやりとりした末に、アプリを(cpではなく)dittoコマンドでコピーすることで解決できました。
ditto TechRacho.app TechRacho_ditto.app
コピー後のファイルサイズは、見事にdu -shと一致するようになりました。後はコピー前のアプリを捨てて削除し、コピー後のファイルをリネームするだけです。
おかげで、30GBほどSSDの空き容量を増やせました🎉
参考: ditto Man Page - macOS - SS64.com
追加情報
今回知ったことをメモしておきます。
macOSのAPFS(Apple File System)というファイルシステムは、いわゆるCopyOnWrite的な振る舞いをするようです。その影響もあってか、du -shコマンドで得られる実際のディスク使用量と、du -sh -Aで得られる「見かけ上のディスク容量」が一致しないことがあるようです。
du -sh ディレクトリ名-- 実際のディスク容量du -sh -A ディレクトリ名-- macOSが認識する見かけ上のディスク容量(Finderの「情報を見る」に相当)
なお、duコマンドの-AオプションはmacOS 12以降でないと使えないようです。
du -sh -Aは論理サイズを再計算しますが、Finderが参照するSpotlightメタデータ(kMDItemLogicalSize)とは厳密には異なるため、数値が多少ズレることがあります。
サイズを厳密に知るには、mdls -name kMDItemLogicalSize(Finderの「情報を見る」と完全に同じ)やmdls -name kMDItemPhysicalSize(duと同じ)コマンドを使います。
mdls -name kMDItemLogicalSize BPS.app
#> kMDItemLogicalSize = 1702390232
mdls -name kMDItemPhysicalSize BPS.app
#> kMDItemPhysicalSize = 1909936128
後から思えば、lipoコマンドでx86_64バイナリを削除したときも、おそらくAPFSが重複ブロックを共有していたために、物理的なサイズがほとんど変わらなかったということなのでしょう。
まとめ
duコマンドで表示されるのは、「ディスク上の実使用量(物理サイズ)」です。
Finderや「情報を見る」やmdls -name kMDItemLogicalSizeで表示されるのは、「論理サイズ(見かけのサイズ)」です。
dittoでコピーすることで、APFSのクローン情報が解消され、Finderが再計算した論理サイズが実際の物理サイズと一致するようになります。



環境