カテゴライズにtreeコマンドを使う

アニメ『アルスラーン戦記 風塵乱舞』
『銀河英雄伝説』にハマったので、田中芳樹原作であるこのアニメも期待しながら見ています。
国とは人なので、よい国を作ろうと思ったら、良い人材を集めるのが何よりの近道なんでしょうね。アルスラーンの魅力によい人材が集まりますが、私だけかもしれませんが、いまいちアルスラーンの魅力がよく分からないです。子分を作るということは、子分の子分も従えるということってのはわかってますが、ナルサスに心服してついてくる人たちが、そのままアルスラーンの配下になる感じがなんだかずるいなあとさえ思ってしまう。まあそういうものとして見てはいますが、その辺りを納得するために、そのうち小説も読んでみようかと思っています。

親分子分の関係はディレクトリツリーそのものです。カテゴリーの親子関係があるなら、ディレクトリに対してのコマンドが使えます。今回は、treeコマンドで、カテゴリーツリーを表示してみます。使うカテゴリはー「WordPressのカテゴリをコマンドラインで抽出する」で得たカテゴリ一覧です。
まずはメタプログラミング。my_termsを材料に、Perlスクリプトを生成します。

~$ perl -pe 'chomp;s|^([^\t]*)\t([^\t]*)$|s/\\b$1\\b/$2/g;\n|' < my_terms > replace.pl
~$ head replace.pl
s/\b2\b/1.基礎/g;
s/\b3\b/2.テキスト整形/g;
s/\b4\b/3.パターンマッチ・検索・置換/g;
s/\b5\b/4.文字コード/g;
s/\b6\b/5.比較・ソート/g;
s/\b7\b/6.バイナリ処理/g;
s/\b8\b/7.ファイル・アーカイブ/g;
s/\b9\b/8.日付・時間/g;
s/\b10\b/9.管理/g;
s/\b11\b/10.ソース・ビルド・インストール/g;
~$ 

タブ区切りの数字をs///g;の形に置換しています。このままだと数字を一桁づず置換するスクリプトのなってしまいますので、置換前数字は\b(単語単位)の指定をします。

生成したPerlスクリプトを試してみます。カテゴリのIDが文字列に置換されていますね。

~$ perl -p replace.pl my_taxonomy | head -20
1	0
1.基礎	0
2.テキスト整形	0
3.パターンマッチ・検索・置換	0
4.文字コード	0
5.比較・ソート	0
6.バイナリ処理	0
7.ファイル・アーカイブ	0
8.日付・時間	0
9.管理	0
10.ソース・ビルド・インストール	0
11.ドキュメント・マニュアル	0
13	0
1-1.テキスト出力	1.基礎
12.計算	0
13.その他のツールとコマンドの連携	0
1-2.繰り返し	1.基礎
18	0
ドラマ・映画・アニメ	0
1-3.コマンドライン操作	1.基礎
~$ 

さらに、未使用のID行を削除します。

~$ perl -p replace.pl my_taxonomy | perl -ne 'print unless /^\d+\t\d+$/;' | head -20
1.基礎	0
2.テキスト整形	0
3.パターンマッチ・検索・置換	0
4.文字コード	0
5.比較・ソート	0
6.バイナリ処理	0
7.ファイル・アーカイブ	0
8.日付・時間	0
9.管理	0
10.ソース・ビルド・インストール	0
11.ドキュメント・マニュアル	0
1-1.テキスト出力	1.基礎
12.計算	0
13.その他のツールとコマンドの連携	0
1-2.繰り返し	1.基礎
ドラマ・映画・アニメ	0
1-3.コマンドライン操作	1.基礎
1-4.パイプ・フィルタ	1.基礎
1-5.ジェネレータ	1.基礎
2-1.部分抽出	2.テキスト整形
~$ 

次はawkで列を入れ替えつず、mkdir -p ディレクトリ を実行するスクリプトを生成します。

~$ perl -p replace.pl my_taxonomy | perl -ne 'print unless /^\d+\t\d+$/;' | awk -F'\t' '{printf "mkdir -p mytree/%s/%s\n",$2,$1}' | tee mytree.sh
mkdir -p mytree/0/1.基礎
mkdir -p mytree/0/2.テキスト整形
mkdir -p mytree/0/3.パターンマッチ・検索・置換
mkdir -p mytree/0/4.文字コード
mkdir -p mytree/0/5.比較・ソート
mkdir -p mytree/0/6.バイナリ処理
mkdir -p mytree/0/7.ファイル・アーカイブ
mkdir -p mytree/0/8.日付・時間
mkdir -p mytree/0/9.管理
mkdir -p mytree/0/10.ソース・ビルド・インストール
mkdir -p mytree/0/11.ドキュメント・マニュアル
mkdir -p mytree/1.基礎/1-1.テキスト出力
mkdir -p mytree/0/12.計算
mkdir -p mytree/0/13.その他のツールとコマンドの連携
mkdir -p mytree/1.基礎/1-2.繰り返し
mkdir -p mytree/0/ドラマ・映画・アニメ
mkdir -p mytree/1.基礎/1-3.コマンドライン操作
mkdir -p mytree/1.基礎/1-4.パイプ・フィルタ
mkdir -p mytree/1.基礎/1-5.ジェネレータ
mkdir -p mytree/2.テキスト整形/2-1.部分抽出
mkdir -p mytree/3.パターンマッチ・検索・置換/3-1.文字列検索
mkdir -p mytree/2.テキスト整形/2-2.加工
mkdir -p mytree/3.パターンマッチ・検索・置換/3-2.正規表現
mkdir -p mytree/2.テキスト整形/2-3.段組
mkdir -p mytree/3.パターンマッチ・検索・置換/36
mkdir -p mytree/3.パターンマッチ・検索・置換/3-3.文字列置換
mkdir -p mytree/3.パターンマッチ・検索・置換/3-3.バイナリ置換
mkdir -p mytree/4.文字コード/4-1.文字コード
mkdir -p mytree/5.比較・ソート/5-1.比較
mkdir -p mytree/5.比較・ソート/5-2.並び替え
mkdir -p mytree/5.比較・ソート/5-3.ランダムに並び替え
mkdir -p mytree/13.その他のツールとコマンドの連携/Vim
mkdir -p mytree/13.その他のツールとコマンドの連携/画像
mkdir -p mytree/13.その他のツールとコマンドの連携/データベース
mkdir -p mytree/13.その他のツールとコマンドの連携/Raspberry PI
mkdir -p mytree/13.その他のツールとコマンドの連携/Minecraft PI EDITION
mkdir -p mytree/13.その他のツールとコマンドの連携/Blender~$ 

後は、mytree.shを実行すればディレクトリ一式が出来上がります。

さて、生成されたカテゴリーツリーを確認してみましょう。

~$ tree mytree
mytree
├── 0
│   ├── 1.基礎
│   ├── 10.ソース・ビルド・インストール
│   ├── 11.ドキュメント・マニュアル
│   ├── 12.計算
│   ├── 13.その他のツールとコマンドの連携
│   ├── 2.テキスト整形
│   ├── 3.パターンマッチ・検索・置換
│   ├── 4.文字コード
│   ├── 5.比較・ソート
│   ├── 6.バイナリ処理
│   ├── 7.ファイル・アーカイブ
│   ├── 8.日付・時間
│   ├── 9.管理
│   └── ドラマ・映画・アニメ
├── 1.基礎
│   ├── 1-1.テキスト出力
│   ├── 1-2.繰り返し
│   ├── 1-3.コマンドライン操作
│   ├── 1-4.パイプ・フィルタ
│   └── 1-5.ジェネレータ
├── 13.その他のツールとコマンドの連携
│   ├── Blender
│   ├── Minecraft
│   ├── Raspberry
│   ├── Vim
│   ├── データベース
│   └── 画像
├── 2.テキスト整形
│   ├── 2-1.部分抽出
│   ├── 2-2.加工
│   └── 2-3.段組
├── 3.パターンマッチ・検索・置換
│   ├── 3-1.文字列検索
│   ├── 3-2.正規表現
│   ├── 3-3.バイナリ置換
│   ├── 3-3.文字列置換
│   └── 36
├── 4.文字コード
│   └── 4-1.文字コード
└── 5.比較・ソート
    ├── 5-1.比較
    ├── 5-2.並び替え
    └── 5-3.ランダムに並び替え

44 directories, 0 files
~$ 

あっ、カテゴリの間違いを見つけました。36番が置換されていない、つまり未使用がヒエラルキーに組み込まれています(いつか直します)。
子分の子分に刺客が紛れ込んでも、このように整理整頓しないと簡単には見つかりませんね。

コメント

タイトルとURLをコピーしました