確認環境
PC | Thinkpad X1 Carbon 2nd Gen |
OS | 12.0-RELEASE-p5 |
概要
下記サイトで、find
やsed
コマンドを駆使してファイルツリーを表示する方法が紹介されている。
お〜面白い。
これを自分好みにオプションを肉付けしたコマンドを作ってみよう。
つくるもの
以下のような機能を実現したいと思う。
- 引数で指定したディレクトリをルートとしたツリーを表示する
- ディレクトリを指定しない場合は、カレントディレクトリをルートとする
- 隠しファイルやディレクトリ(
.
から始まるもの)はオプション指定時のみ表示する - ディレクトリのみの表示もできる
- 表示する最大ディレクトリ階層数を制限できる
- ファイル名、親ディレクトリ名でフィルタできる
コード
ひとまず書いたコードがこちら。
英語なんて単語を並べれば通じると信じてる。
補足
59行目のgrep -v
は隠しファイルフィルタ用。
60行目のgrep
は-p
オプションによるフィルタ用。
親ディレクトリの文字列を置き換え前にフィルタしているのがポイント。
フィルタをかけない時は、下記のような動作になる。
- 28行目で必ずマッチしないパターンを指定 ->
grep -v
で結果全行出力 - 23行目で必ずマッチするパターンを指定 ->
grep
で結果全行出力
しかし、これだとフィルタをかけないときも必ずGrepして効率悪そうだな。
そう思って、grep
コマンドそのもも変数に入れようとしたけどパイプが邪魔でうまいやり方が分からない。
今の僕のシェルスクリプトレベルだとif
で分岐するしか修正案が思い浮かばない。。
何か、きっと何かカッコいい方法があるはずだ。。
でもまぁ今日はこの辺で。
ご意見・ご指摘などあれば、コメント下さいまし。
実行例
引数なし
> tree
/full/path/current/dir
|-- file0
|-- rootdir
| |-- dirA
| | |-- file1
| | |-- file2
| |-- dirB
| | |-- dirC
引数でルートディレクトリ指定
> tree rootdir
rootdir
|-- dirA
| |-- file1
| |-- file2
|-- dirB
| |-- dirC
-aオプションで隠しファイルも表示
> tree -a rootdir rootdir |-- .dotdir |-- dirA | |-- file1 | |-- file2 |-- dirB | |-- .dotfile | |-- dirC
-dオプションでディレクトリのみ表示
> tree -d rootdir rootdir |-- dirA |-- dirB | |-- dirC
-lオプションで表示する階層を制限
> tree -l 1 rootdir rootdir |-- dirA |-- dirB
-pオプションで親ディレクトリ名によるフィルタリング
> tree -p dirA rootdir rootdir |-- dirA | |-- file1 | |-- file2
おしまい。