awk でディレクトリは渡れないけど tree なら

awk 単独では Python の os.walk のようにディレクトリを走査することはできません。awk 流にするのであれば、find で取得した内容を tree にするということになります。

#! /usr/bin/gawk -f

BEGIN {
    print ARGV[1];
    find_cmd = "find " ARGV[1] " -type d | sort";
    while ((find_cmd | getline) > 0) {
        sub(ARGV[1], "");
        gsub(/[^\/]*\//, "/");
        line[++i] = $0;
        last = i;
    }
    close(find_cmd);

    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];
    }
}

実際に実行してみます。

$ gawk -f dtree.awk ../gawk-stable
../gawk-stable
+--.deps
+--CVS
+--README_d
|  +--CVS
|  +--OBSOLETE
|     +--CVS
+--awklib
|  +--.deps
|  +--CVS
|  +--eg
|     +--CVS
|     +--data
|     |  +--CVS
|     +--lib
|     |  +--CVS
|     +--misc
|     |  +--CVS
|     +--network
|     |  +--CVS
|     +--prog
|        +--CVS
<snip>

これは CVS 版 gawk のディレクトリツリーですが、お手軽に試すことができます。

今回この記事を書こうと思った発端は、階層のあるディレクトリを走査するであり、使わせてもらった dtree.awk はディレクトリのツリー表示(ディレクトリの tree 構造を見る) です。このアルゴリズムというか表示のテクニックに何度も感動したことがありますが、大きなプログラムではないのでどうやって表示されているか調べてみるのも良いと思います。

tag_nawk.pngtag_nawk.pngtag_nawk.pngtag_nawk.png