読者です 読者をやめる 読者になる 読者になる

leopardgeckoのブログ

Macの関連事項など

GeekToolでディスク容量を整理して表示する。

Mac GeekTool

GeekToolでディスク容量を表示するために普通使われているスクリプト

df -hl

のようなものでしょう。これはこんな感じの表示になります。

f:id:leopardgecko:20161101110104p:plain

ご覧の通りかなりゴチャゴチャしており場所も取ってしまうので、もっとシンプルに見やすく整理したくなるのが人情というものだろうと思います。

内蔵ディスクのみを表示するならばFilesystemを決め打ちして必要なフィールドだけ取り出すというシンプルな技が使えるのですが、外付けドライブやSDカードやネットワーク経由でマウントしているものなども表示させたい場合には少々の工夫が必要になります。

 

情報をトータル容量と使用容量と空き容量とディスク名に絞り、外付けドライブやネットワーク経由のマウントも表示させるスクリプトは以下の通りです。フォントは等幅のものを指定してください。

df -h | grep 'Filesystem\|/dev/\|/Volumes/' | 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 ""}'

例えば二つの外付けディスクを使用している場合には以下のような表示になります。

f:id:leopardgecko:20161031211403p:plain

だいぶスッキリした感じになりました。

 

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

f:id:leopardgecko:20161031230235p:plain

一番上の行に下線をつけて、ドライブ名をFinderでの一般的な表示にして左側に移し、使用量の割合にグラフを追加しています。

このgeekletにはちょっとしたトリックがあります。日本語などのマルチバイト文字が含まれるときれいに桁合わせができなくなってしまうので、ディスクドライブの名称のみを表示するgeekletとディスク容量を表示するgeekletの二つを作り、その二つを同じ座標で重ねて表示しています。

 

まず、ディスク名を表示するスクリプトは以下の通りです。起動ドライブの名称は「df」から取得すると名無しになってしまうので「Macintosh HD」に決め打ちしています。他の名前に変えたい場合はスクリプトの該当部分を書き換えてください。その他のディスク名はFinderで表示されている名前と同じものになるはずです。

echo
df -h | grep '/dev/\|/Volumes/' | awk -F"/Volumes/" '{printf "%.15s",$2;print""}' | sed -e 's/^$/Macintosh HD/'

 

 

次に容量とグラフを表示するスクリプトです。グラフ表示のため少々複雑な処理になっています。「df」で取得したデータを一行ずつ配列変数に代入して、for文で一行ずつ処理していくという方法でなんとか整形しています。

echo "\033[4mDrive             Size   Used  Avail         Capacity\033[0m"
diskdata=(`df -h | grep '/dev/\|/Volumes/' | awk 'BEGIN{OFS=","}{print $2,$3,$4,$5}' | sed -e 's/Mi/MB/g' -e 's/Gi/GB/g' -e 's/Ti/TB/g' -e 's/\%//g'`)
for (( i = 0; i < ${#diskdata[@]}; ++i ))
do
    diskcapa[$i]=`echo ${diskdata[$i]} | awk -F, '{print $4}'`
    printf "                "
    echo ${diskdata[$i]} | awk -F, '{printf(" %5s  %5s  %5s  ",$1,$2,$3)}'
    typeset -i b=9
    while [ $b -lt ${diskcapa[$i]} ]
    do
        echo "\033[0;37m▇\033[0m\c"
   	b=`expr $b + 10`
    done
    while [ $b -lt 100 ]
    do
        echo "\033[0;30m▇\033[0m\c"
        b=`expr $b + 10`
    done
    printf " %3s%%\n" ${diskcapa[$i]}
done

この二つのgeekletを全く同じ座標に置けば提示した画像のような表示になります。

 

今回紹介したスクリプトは新たにSDカードなどをマウントして表示をリフレッシュさせた時には表示行数がその分だけ増えますので、geekletの表示サイズは縦に少し余裕を持たせていた方が良いでしょう。