tree + du

tree コマンドが便利 - IT戦記 とか、どのフォルダがどのぐらいの容量を使っているか、おしゃれに確認できる『DriveCircle』 | IDEA*IDEA とかを見ていて、かつて紹介させていただいた dtree を find ではなく du で組みなおしたくなったので、作り変えてみました。

#!/bin/sh

# inspired by dtree
#   http://www.math.kobe-u.ac.jp/~kodama/dtree
#   1997.9.27 kdm

start='.'; if [ -n "$1" ];then start="$1"; fi
if [ ! -d $start ];then echo "\"$start\" is not a directory.";exit 1;fi
if [ ! -x $start ];then echo "Permission denied to search \"$start\".";exit 2;fi
cd $start; echo `pwd`

unit=$2

du $unit | sort -k2 | gawk '
{
    n_depth = gsub(/[^\/]*\//, "/", $2);
    line[NR] = $2 "(" $1 ")";
    last = NR;
}
END {
    lead=" ";
    l="  " lead;
    lead0=l l l l l l l l l l l l l l l l l l l l;
    for(i = last; 2 <= i; i--) {
        match(line[i], /\/*/);
        len = RLENGTH;
        lead = substr(lead lead0, 1, (len - 1) * 3);
        line[i]=lead "+--" substr(line[i], len + 1);
        lead=lead "|";
    }
    for(i = 2; i <= last; i++) {
        print line[i];
    }
}'

exit 0

gawk-3.1.6 のディレクトリに対しての実行結果はこんな感じです。シンプルですが過不足もありません。

$ ./dutree ../gawk-3.1.6
/home/zaurus/awk/gawk-3.1.6
+--.deps(164)
+--README_d(112)
|  +--OBSOLETE(28)
+--autom4te.cache(4)
+--awklib(412)
|  +--.deps(12)
|  +--eg(300)
|     +--data(20)
|     +--lib(88)
|     +--misc(20)
|     +--network(92)
|     +--prog(76)
+--doc(3164)
+--extension(88)
+--m4(224)
+--missing_d(164)
+--pc(220)
|  +--awklib(16)
|  +--include(40)
|     +--sys(12)
+--po(1952)
+--posix(16)
+--test(3456)
|  +--lib(8)
|  +--reg(52)
|     +--Obsolete(20)
+--unsupported(108)
|  +--atari(52)
|  +--tandem(52)
+--vms(276)

このくらいの深さであれば、グラフ表示してもいいのですが、これが必要な時って結構深い場所までダイブしていくような場合だと思われますので、あえてここで止めておきます。
しかし、このツリー表示のテクニックは自分で身についてないなぁ。