【シェルと遊ぼう】ファイルツリーを表示するシェルスクリプト

確認環境

PC Thinkpad X1 Carbon 2nd Gen
OS 12.0-RELEASE-p5

概要

下記サイトで、findsedコマンドを駆使してファイルツリーを表示する方法が紹介されている。

qiita.com

お〜面白い。
これを自分好みにオプションを肉付けしたコマンドを作ってみよう。

つくるもの

以下のような機能を実現したいと思う。

  1. 引数で指定したディレクトリをルートとしたツリーを表示する
  2. ディレクトリを指定しない場合は、カレントディレクトリをルートとする
  3. 隠しファイルやディレクトリ(.から始まるもの)はオプション指定時のみ表示する
  4. ディレクトリのみの表示もできる
  5. 表示する最大ディレクトリ階層数を制限できる
  6. ファイル名、親ディレクトリ名でフィルタできる

コード

ひとまず書いたコードがこちら。
英語なんて単語を並べれば通じると信じてる。

print file tree

補足

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

おしまい。