leopardgeckoのブログ

Macの関連事項など

GeekToolでディスク(ストレージ)容量を整理して表示する。(改訂版)

最終更新 2019/10/9 : macOS Catalinaに合わせて記述を変更。

GeekToolというのはMacのデスクトップをカスタマイズするツールです。 だいぶ前にGeekToolでディスク容量を表示するスクリプトを紹介しましたが、その後macOSの仕様変更などもあり、スクリプトを全体的に見直して記事を書きなおすことにしました。以前の記事とかぶる部分もありますがご容赦ください。

GeekToolでマウントしているディスク容量を表示するには、簡単なスクリプトでは

df -hl

というものがあります。これを実行すると表示は以下のようになります。

Filesystem     Size   Used  Avail Capacity iused       ifree %iused  Mounted on
/dev/disk2s5  1.0Ti  9.9Gi  876Gi     2%  482156 10947937764    0%   /
/dev/disk2s1  1.0Ti  147Gi  876Gi    15% 1420284 10946999636    0%   /System/Volumes/Data
/dev/disk2s4  1.0Ti  2.0Gi  876Gi     1%       3 10948419917    0%   /private/var/vm
/dev/disk3s2  931Gi  721Gi  210Gi    78%  404249  4294563030    0%   /Volumes/名称未設定
/dev/disk4s2  1.8Ti  935Gi  927Gi    51% 7582410  4287384869    0%   /Volumes/Time Machine

これだけでも使えないことはないのですが、余計な情報が多いので表示を整理してみます。
情報をトータル容量と使用容量と空き容量とディスク名に絞り、ネットワーク経由でマウントしているディスクも表示するスクリプトは以下の通りです。等幅フォントを指定してください。

ディスク容量 その1

df -h | grep 'Filesystem\|/dev/disk\|/Volumes/' | grep -v 'private/var/vm\|firmwaresyncd\|com.apple.TimeMachine.localsnapshots\|auto_home\|\/Volumes\/Recovery\|\/$' | awk '{for(i=2;i<=4;i++){gsub("Ti","TB",$i);gsub("Gi","GB",$i);gsub("Mi","MB",$i)};printf " %5s  %5s  %5s  %8s  ",$2,$3,$4,$5;for(i=9;i<=NF;i++)printf $i" ";print ""}'

このスクリプトでは以下のような表示になります。

  Size   Used  Avail  Capacity  Mounted on 
 1.0TB  147GB  876GB       15%  /System/Volumes/Data 
 931GB  721GB  210GB       78%  /Volumes/名称未設定 
 1.8TB  935GB  927GB       51%  /Volumes/Time Machine 

ここで終わりにしても良いのですが、さらに一歩進んでこんな感じの表示にしてみます。

f:id:leopardgecko:20190205153459p:plain

一番上の行に下線をつけて、ドライブ名をFinderでの一般的な表示にして左側に移し、使用量の割合にグラフを追加しています。
スクリプトは以下の通りです。ディスク名をもっと長く(または短く)表示したい場合は、スクリプトの最初の方にあるdisknameln=17というところの数字を変更してください。ディスク名に日本語を使っている場合は日本語に対応した等幅フォント(Ricty、Osaka-Monoなど)が必要です。上の画像ではRicty Discordを使用しています。

ディスク容量 その2

このスクリプトのGeekletは以下からダウンロードできます。

[Geekletのダウンロード]

ちょっと解説

ど素人の書いたスクリプトなので変なところが色々あると思いますが・・・
一番大変だったのはprintfで日本語の桁数を合わせて表示することでした。シェルスクリプトの中での日本語の扱いは、多くの場合で表示は2文字分で中身は3バイトで文字数をカウントすると1文字という非常に面倒くさい状況です。そこをどうやって帳尻を合わせるかを考えるのが面倒でした。
ニーズがありそうな話なのでネットに情報があるかと思ったのですがどういうわけか中途半端な情報しかなく、長さがわからない文字列の桁数を揃えて表示するための方法は自分で考える必要がありました。かなり強引な処理をやっているので本当にこれで良いのかは疑問が残るところもあるのですが、一応思った通りに動作はしているのでひとまずはこれで良しとします。
もっとスマートなやり方をご存知の方がおられたらご一報いただければ嬉しいです・・・