テキストからディレクトリを作成する

あるツリー構造をもったディレクトリを一気に作るため、時々以下のようなテキストで構想をすることがあります。

aaa
    bbb
    ccc
        ddd
    eee

ここで作成したいのは

aaa/
aaa/bbb/
aaa/ccc/
aaa/ccc/ddd/
aaa/eee/

というようなディレクトリ構造です。 最初のテキストがスペース 4 つでインデントされているとすると、以下のような AWK スクリプトで Shell スクリプトを作成してみます。

#! /usr/local/bin/gawk -f
# tree2dir.awk

BEGIN {
    FS = "    ";
    dir_delimiter = "/";
}

{
    for (i = 1; i <= NF; i++) {
        if ($i != "") {
            dir[i] = $i;

            target_dir = "";
            for (j = i; j >= 1; j--) {
                target_dir = dir[j] dir_delimiter target_dir;
            }

            print "mkdir -p " substr(target_dir, 1, length(target_dir) - 1);
        }
    }
}

実行してみましょう。

$ cat test.txt
aaa
    bbb
    ccc
        ddd
    eee

$ nawk -f tree2dir.awk test.txt
mkdir -p aaa
mkdir -p aaa/bbb
mkdir -p aaa/ccc
mkdir -p aaa/ccc/ddd
mkdir -p aaa/eee

実際に実行するにはこれを Shell にパイプで繋げます。

$ nawk -f tree2dir.awk test.txt | sh

元々、メールのディレクトリ構造を一気に作成したいという個人的な要望から作成してみました。 なので、ディレクトリの区切りが変数になっているので、これを "." (ドット) にすれば Maildir 形式のディレクトリも作成できますし、そのままだと MH 形式のディレクトリを作成することになります。

tag_nawk.png tag_nawk.png tag_nawk.png tag_nawk.png