ディレクトリ構造を一覧で確認したいとき、私はよくtreeコマンドを使います。
構造が一目で分かり、とても便利です。
ただ、以前から一つだけ気になっていた点がありました。
ファイルサイズを表示すると、必ずファイル名の前に出てしまうことです。
一覧として眺めるときは、「名前 → サイズ」の順で目に入ったほうが、私は読みやすく感じます。
そこで今回は、treeでサイズを表示しつつ表示位置をファイル名の後ろに移動し、watchで1秒ごとに更新表示するコマンドを作りました1。

watch -n 1 -d "tree -sh | awk 'match(\$0,/\\[[[:space:]]*[0-9.]+([BKMGTP]|[KMGTPE]iB)?\\]/){s=substr(\$0,RSTART,RLENGTH);gsub(/\\[[[:space:]]*[0-9.]+([BKMGTP]|[KMGTPE]iB)?\\][[:space:]]*/,\" \");sub(/[[:space:]]+$/,\"\");print \$0\" \"s;next}{print}'"Code language: JavaScript (javascript)
-dは差分のハイライト表示です2。
1. treeでサイズを表示するとどうなるか
1.1. tree -sh を試す
まずは基本です。
tree -sh
-sはサイズ表示、-hは人間向け(KやM単位)です3。
出力は次のようになります。
├── [4.0K] file.txtCode language: CSS (css)
完成形は次のコマンドです。
これをワンライナーにすると、
出力はこうなります。
├── README.md [ 3]
└── docs [4.0K]
└── hybrid_chatbot_specification.md [4.1K]Code language: CSS (css)
サイズが角括弧付きで表示されますが、必ず前に出ます。
オプションで位置を変える方法はありません。
この時点で、「tree単体では無理そうだ」と判断しました。
2. awkで表示を加工する
treeの出力はただのテキストです。
ならば、一度サイズを取り除き、行末に付け直せばいいと考えました。
テキスト加工といえばawkです。
tree -sh |
awk '
match($0, /\[[[:space:]]*[0-9.]+([BKMGTP]|[KMGTPE]iB)?\]/) {
s = substr($0, RSTART, RLENGTH)
# サイズ表記(+直後の余分な空白)を削除して、行末に付け直す
gsub(/\[[[:space:]]*[0-9.]+([BKMGTP]|[KMGTPE]iB)?\][[:space:]]*/, " ")
sub(/[[:space:]]+$/, "")
print $0 " " s
next
}
{ print }
'
Code language: PHP (php)
行のどこかに[数字 単位]という形があれば、それをサイズとして扱う方法です。
awkのmatch()関数を使うと、文字列の中から特定のパターンを探せます。
これで行中のサイズも拾えるようになりました4。
最終的に考えた条件はこうです。
[の後に空白があってもよい。- 数字は必須。
- 単位はあってもなくてもよい。
この条件を正規表現に落とし込みました。
ここは少し読みにくいですが、「現実の出力に合わせて妥協した」部分です。
名前を読んでからサイズが目に入る。
個人的には、これだけでかなり見やすくなりました。
watchコマンドは指定されたコマンドを定期的に実行し、出力をリアルタイムで表示するLinuxユーティリティです。デフォルトでは2秒ごとに更新されますが、-nオプションで間隔をカスタマイズできます – watch command in Linux with Examples – GeeksforGeekswatchコマンドの-dオプションは、連続する更新間の差分を強調表示し、変更箇所を見つけやすくします – How to Use the Watch Command in Linux: Monitor Commands in Real Time-sオプションはファイルサイズをバイト単位で表示し、-hオプションと組み合わせることで、KB、MB、GBなどの人間が読みやすい単位で表示されます – Linux ‘tree Command’ Usage Examples for Beginnersmatch()関数とともにRSTARTおよびRLENGTH変数を使用することで、一致した部分文字列の位置と長さを特定し、substr()関数で抽出できます – RLENGTH and RSTART – Learning AWK Programming