ls -lR の結果から Tree 表示

以前awk でディレクトリは渡れないけど tree ならでも Tree 表示を行いましたが、今回はスタッフBLOG - ファイルの一覧をCSVに出力に触発されて Tree + CSV での表示を行います。

表示する内容にもよりますが、ここでは比較的ポピュラーな ls コマンドを再帰的に使用するオプションである -R と一緒に用いた結果を使うことにします。 そのままの 'ls -lR' では扱いにくいので、'ls -alR --time-style=long-iso' とさせていただきます。 決してこれは awk に機能が少ないというわけではなく、できる限り awk の得意な土俵でプログラムを組むためです。

今回は以下のようなプログラムを用意しました。

#! /usr/bin/gawk -f
# dir_tree.awk

BEGIN {
    "pwd" | getline pwd;
    print pwd;
}

/^\..*:$/ {
    sub(/\.\//, "");
    sub(/:$/, "");
    dir_name = $0;
    depth = gsub(/\//, "/");
    "basename " dir_name | getline base_name;
    dir_str = "+[" base_name "]";
    for (i = depth; i > 0; i--) {
        dir_str = "|  " dir_str;
    }
    print dir_str;
}

NF == 8 && $0 !~ /^d/ {
    file_name = $NF;
    file_size = $5;
    file_date = $6;
    file_time = $7;
    sub(/\+\[.*\]/, "|", dir_str);
    file_size = int(file_size / 1000);
    print dir_str "  +--" file_name "," file_date " " file_time "," file_size "Kbyte";
}

少し遠回しなところがあるかもしれませんが、awk らしく pattern-action を重視しています。 結果は以下のとおりです。

ここでは gawk の CVS 版の README_d ディレクトリ内で実行した結果を載せています。

$ \ls -alR --time-style=long-iso | gawk -f dir_tree.awk
gawk-stable/README_d
+[.]
|  +--README.VMS,2008-07-20 14:30,3Kbyte
|  +--README.aix,2008-07-20 14:30,0Kbyte
|  +--README.atari,2008-07-20 14:30,1Kbyte
|  +--README.beos,2008-07-20 14:30,3Kbyte
|  +--README.cygwin-dynamic,2008-07-20 14:30,3Kbyte
|  +--README.hpux,2008-07-20 14:30,2Kbyte
|  +--README.ia64,2008-07-20 14:30,0Kbyte
|  +--README.macos,2008-07-20 14:30,0Kbyte
|  +--README.multibyte,2008-07-20 14:30,1Kbyte
|  +--README.pc,2008-07-20 14:30,16Kbyte
|  +--README.pcdynamic,2008-07-20 14:30,4Kbyte
|  +--README.sgi,2008-07-20 14:30,0Kbyte
|  +--README.solaris,2008-07-20 14:30,3Kbyte
|  +--README.sunos4,2008-07-20 14:30,0Kbyte
|  +--README.tandem,2008-07-20 14:30,1Kbyte
|  +--README.tests,2008-07-20 14:30,1Kbyte
|  +--README.zos,2008-07-20 14:30,1Kbyte
+[CVS]
|  +--Entries,2008-07-20 22:30,0Kbyte
|  +--Repository,2008-07-20 14:30,0Kbyte
|  +--Root,2008-07-20 14:30,0Kbyte
|  +--Template,2008-07-20 22:30,0Kbyte
+[OBSOLETE]
|  +--README.FIRST,2008-07-20 14:30,0Kbyte
|  +--README.linux,2008-07-20 14:30,0Kbyte
|  +--README.sco,2008-07-20 14:30,1Kbyte
|  +--README.sony,2008-07-20 14:30,0Kbyte
|  +--README.ultrix,2008-07-20 14:30,1Kbyte
|  +--README.yacc,2008-07-20 14:30,0Kbyte
|  +[CVS]
|  |  +--Entries,2008-07-20 22:30,0Kbyte
|  |  +--Repository,2008-07-20 14:30,0Kbyte
|  |  +--Root,2008-07-20 14:30,0Kbyte
|  |  +--Template,2008-07-20 22:30,0Kbyte

先ほど書いたとおり pattern-action にこだわったため、Tree 表示の不要なところまで表示されていますが、そこは許してください。 一度配列に格納するなどの処理をしないといけないのですが、その分 awk らしさが抜けてしまいます。

tag_nawk.pngtag_nawk.pngtag_nawk.pngtag_nawk.png