LoginSignup
6
7

More than 5 years have passed since last update.

【sed】treeコマンドが使えない環境でsedコマンドを使うことによりtreeコマンドを作成&詳細解説[Linux]

Last updated at Posted at 2019-02-19

はじめに

treeコマンドはディレクトリ構造を確認する際に非常に便利なコマンドですが、macOS(Unix)環境には、treeコマンドは対応しておりません。
そこで、こちらの記事を参考に、treeコマンドをfindコマンドとsedコマンドを組み合わせてほとんど同じような機能を実現するコマンドを作成しました。

同じようなコマンドは、他の記事にも載っていますが、そのコマンドを丁寧に説明した記事がなかったので、自己理解も兼ねて、コマンドを解明しその詳細を記事に書き留めます。

参考

sedコマンドや正規表現の理解が曖昧な方は、下記記事が参考になります。

tree コマンドが無い環境で tree コマンドを実現
sedでこういう時はどう書く?
sedコマンドの備忘録
サルにもわかる正規表現入門

(擬似)treeコマンド作成

はじめに、コマンド作成結果と、そのコマンドをエイリアスに設定する手順を示します。

1. 作成コマンド

$ pwd ; find . | sort | sed '1d;s/^\.//;s/\/\([^/]*\)$/|--\1/;s/\/[^/|]*/|  /g' | less

2. エイリアスに設定

~/.bashrc
alias tree="pwd ; find . | sort | sed '1d;s/^\.//;s/\/\([^/]*\)$/|--\1/;s/\/[^/|]*/|  /g' | less"

3. bashに読み込み

$ source ~/.bashrc

4. 確認

$ tree
/Users/takuyanin/lang
|--natural
|  |--chinese
|  |--english
|  |--french
|  |--japanese
|  |--russian
|--programming
|  |--compiler
|  |  |--c
|  |  |--c++
|  |  |--fortran
|  |--interpreter
|  |  |--perl
|  |  |--php
|  |  |--python
|  |  |--ruby
|  |--others
|  |  |--java

treeコマンドライクに結果が表示されました。Good!

詳細解説

先に示したコマンドpwd ; find . | sort | sed '1d;s/^\.//;s/\/\([^/]*\)$/|--\1/;s/\/[^/|]*/| /g' | lessを分割して解説していきます。

ここでは、コマンド実行結果(上記)にも示した、langディレクトリのツリー構造を表示することを目標とするとします。

1. pwdとfind

$ pwd ; find .

;(セミコロン)について補足します。
コマンド1 ; コマンド2とすると、コマンド1が終了し次第コマンド2を実行します。ただし、コマンド1の実行結果に関わらずコマンド2実行されることに注意しましょう。

結果

一番上の/Users/takuyanin/langpwdの実行結果で、
それ以降がfindの実行結果となります。

$ pwd ; find .
/Users/takuyanin/lang
.
./natural
./natural/japanese
./natural/russian
./natural/english
./natural/french
./natural/chinese
./programming
./programming/interpreter
./programming/interpreter/python
./programming/interpreter/perl
./programming/interpreter/php
./programming/interpreter/ruby
./programming/others
./programming/others/java
./programming/compiler
./programming/compiler/c++
./programming/compiler/fortran
./programming/compiler/c

2. pwdとfindとsort

$ pwd ; find . | sort

|(パイプ)について補足します。
コマンド1 | コマンド2とするとコマンド1の結果をコマンド2に渡して実行します

結果

先ほどと違い、結果がソートされているのが確認できます。

$ pwd ; find . | sort
/Users/takuyanin/lang
.
./natural
./natural/chinese
./natural/english
./natural/french
./natural/japanese
./natural/russian
./programming
./programming/compiler
./programming/compiler/c
./programming/compiler/c++
./programming/compiler/fortran
./programming/interpreter
./programming/interpreter/perl
./programming/interpreter/php
./programming/interpreter/python
./programming/interpreter/ruby
./programming/others
./programming/others/java

3.1 pwdとfindとsortとsed

$ pwd ; find . | sort | sed '1d'

sed '1d'で1行目を削除します。

結果

一行目の.が削除されているのが確認できます。

$ pwd ; find . | LC_ALL=C sort | sed '1d;'
/Users/takuyanin/lang
./natural
./natural/chinese
./natural/english
./natural/french
./natural/japanese
./natural/russian
./programming
./programming/compiler
./programming/compiler/c
./programming/compiler/c++
./programming/compiler/fortran
./programming/interpreter
./programming/interpreter/perl
./programming/interpreter/php
./programming/interpreter/python
./programming/interpreter/ruby
./programming/others
./programming/others/java

3.2 pwdとfindとsortとsed

$ pwd ; find . |  sort | sed '1d; s/^\.//'

sed 's/^\.//'により、先頭のピリオド「.」を何も無し「」に置換します。
つまり、ピリオド.を削除します。

結果

上記コマンドと実行結果の違いがわかりにくいですが、各行のピリオド.が削除されているのが確認できます。

$ pwd ; find . |  sort | sed '1d; s/^\.//'
/Users/takuyanin/lang
/natural
/natural/chinese
/natural/english
/natural/french
/natural/japanese
/natural/russian
/programming
/programming/compiler
/programming/compiler/c
/programming/compiler/c++
/programming/compiler/fortran
/programming/interpreter
/programming/interpreter/perl
/programming/interpreter/php
/programming/interpreter/python
/programming/interpreter/ruby
/programming/others
/programming/others/java

3.3 pwdとfindとsortとsed

$ pwd ; find . |  sort | sed '1d; s/^\.//; s/\/\([^/]*\)$/|--\1/;'

sed 's/\/\([^/]*\)$/|--\1/;'について解説します。

[^ ]: [ ]の中で「^」を記述すると、括弧内の文字以外の任意の一文字を表します。
-> つまり、[^/]は「/」以外の任意の一文字

/\( )\/\1/ : \( )\内の文字を\1に代入
-> つまり、/\/\([^/]*\)$/|--\1/は、\/\([^/]*\)$が仮に/endであった時、\1endを表すので、/end|--endに置換します。
注意点としては、最後尾から一つの/のみ対象ということです。
例えばhoge/fuga/endhoge/fuga|--endとなります。

結果

下記結果は、上記の説明の通りになっています。

$ pwd ; find . |  sort | sed '1d; s/^\.//; s/\/\([^/]*\)$/|--\1/;'
/Users/takuyanin/lang
|--natural
/natural|--chinese
/natural|--english
/natural|--french
/natural|--japanese
/natural|--russian
|--programming
/programming|--compiler
/programming/compiler|--c
/programming/compiler|--c++
/programming/compiler|--fortran
/programming|--interpreter
/programming/interpreter|--perl
/programming/interpreter|--php
/programming/interpreter|--python
/programming/interpreter|--ruby
/programming|--others
/programming/others|--java

3.4 pwdとfindとsortとsed

$ pwd ; find . |  sort | sed '1d; s/^\.//; s/\/\([^/]*\)$/|--\1/; s/\/[^/|]*/|  /g'

sed 's/\/[^/|]*/| /g'について解説します。
[^/|] : スラッシュ/とパイプ|以外の任意の一文字

/\/[^/|]*/| /g : /piyoといった表示を|(スペース2つ)に置換します。
-> つまり/\/[^/|]*/| /g/piyo/--aha/ |--ahaに置換します。

結果

目的どおり結果が表示されました。Great!

$ pwd ; find . |  sort | sed '1d; s/^\.//; s/\/\([^/]*\)$/|--\1/; s/\/[^/|]*/|  /g'
/Users/takuyanin/lang
|--natural
|  |--chinese
|  |--english
|  |--french
|  |--japanese
|  |--russian
|--programming
|  |--compiler
|  |  |--c
|  |  |--c++
|  |  |--fortran
|  |--interpreter
|  |  |--perl
|  |  |--php
|  |  |--python
|  |  |--ruby
|  |--others
|  |  |--java

4. pwdとfindとsortとsedとless

最後に、lessコマンドをパイプで繋ぎます。
ツリー構造の表示結果は画面に収まらないことが多々あるので、lessコマンドを使うことによって、結果をみやすくするとします。

$ pwd ; find . |  sort | sed '1d; s/^\.//; s/\/\([^/]*\)$/|--\1/; s/\/[^/|]*/|  /g' | less

結果

今回は、画面に収まる程度ですので、先ほどと実行結果に変化はありませんね。

$ pwd ; find . |  sort | sed '1d; s/^\.//; s/\/\([^/]*\)$/|--\1/; s/\/[^/|]*/|  /g' | less
/Users/takuyanin/lang
|--natural
|  |--chinese
|  |--english
|  |--french
|  |--japanese
|  |--russian
|--programming
|  |--compiler
|  |  |--c
|  |  |--c++
|  |  |--fortran
|  |--interpreter
|  |  |--perl
|  |  |--php
|  |  |--python
|  |  |--ruby
|  |--others
|  |  |--java

おわりに

このように、自分の環境にはないコマンドを作成することは、linuxコマンドの勉強にもなれば、作業を効率化するコマンド(シェルスクリプトなど)を独自に作り出せようになりますよね。

この記事が役に立ったという方は、いいね、お願いします(^^)

6
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7