leopardgeckoのブログ

Macの関連事項など

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

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

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

df -hl

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

Filesystem     Size   Used  Avail Capacity  iused               ifree %iused  Mounted on
/dev/disk2s1  1.0Ti  140Gi  893Gi    14%  2008826 9223372036852766981    0%   /
/dev/disk2s4  1.0Ti  3.0Gi  893Gi     1%        3 9223372036854775804    0%   /private/var/vm
/dev/disk4s2  931Gi  716Gi  215Gi    77%   327559          4294639720    0%   /Volumes/名称未設定
/dev/disk3s2  1.8Ti  1.6Ti  198Gi    90% 30367734          4264599545    1%   /Volumes/Time Machine

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

ディスク容量 その1

df -h | grep 'Filesystem\|/dev/disk\|/Volumes/' | grep -v 'private/var/vm\|firmwaresyncd\|com.apple.TimeMachine.localsnapshots' | 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  139GB  893GB       14%  / 
 931GB  716GB  215GB       77%  /Volumes/名称未設定 
 1.8TB  1.6TB  198GB       90%  /Volumes/Time Machine 

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

f:id:leopardgecko:20190205153459p:plain

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

ディスク容量 その2

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

[Geekletのダウンロード]

ちょっと解説

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