Featured image of post 【めちゃくそ便利】treeコマンドでディレクトリ構造を出力しよう!【オプション多数】

【めちゃくそ便利】treeコマンドでディレクトリ構造を出力しよう!【オプション多数】

2841文字

ディレクトリ構造の表現方法

ディレクトリ構造をうまく表現したい

主にインフラ構築やWebシステムを開発していると、他の開発者にディレクトリ構造を共有したいという場合があると思います。

その場合、自分でFinderやエクスプローラーを開きながら手打ちでディレクトリ構造をテキストエディターで作ると、ディレクトリ構造が複雑な場合に確実に死亡しますし、タイポコピペミスで間違ったディレクトリ構造になってしまい、結果として正しくない情報を共有してしまう恐れがあります。

また、自前でディレクトリ構造を表現する場合、以下のような文字記号を利用して表現すると思いますが、半角や全角がまじるとうまくインデントが表現されずに見にくくなってしまうことも多々あります。

罫線一覧
┣ ┠ ┝ ├
┫ ┨ ┥ ┤
│ ┃
─ ━
┌ ┏ ┓ ┐
└ ┗ ┛ ┘

試しに以下のようなディレクトリを自前で上記の罫線で表現してみましょう。

ディレクトリ構造サンプル
../../../directory/tree
├──.DS_Store
├──.private
│  └──security.txt
├──common
│  └──common.html
├──empty
├──fuga
│  └──fuga.html
├──hoge
│  └──hoge.index
└──日本語
   └──こんにちは
      └──hello.txt

すごくめんどくさいです。。。

treeコマンド

そんな苦難から助けてくれるのがtreeコマンドです!

このコマンドを使えば、一発でディレクトリをテキスト表示してくれるので、正確な情報を抽出する事が可能になります。

筆者はプログラミング関連の記事を多く執筆しているので、多用しています!!

Macであれば、Homebrewから簡単にインストールする事が可能です。

手順

インストール

まずはtree本体をHomebrewでインストールしましょう。
以下のコマンドを実行してください。

command
brew install tree

以下のような実行ログが表示されればインストール完了です。

実効ログ
==> Downloading https://homebrew.bintray.com/bottles/tree-1.7.0.el_capitan.bottle.1.tar.gz
Already downloaded: /Users/{ユーザー名}/Library/Caches/Homebrew/tree-1.7.0.el_capitan.bottle.1.tar.gz
==> Pouring tree-1.7.0.el_capitan.bottle.1.tar.gz
🍺  /usr/local/Cellar/tree/1.7.0: 7 files, 113.4KB

使い方

まずはシンプルなディレクトリ構造を出力してみましょう。

出力したいディレクトリにて、以下のコマンドを実行してみてください。

command
tree

以下のような表示になり、再起的にディレクトリ情報が表示されます。

実効ログ
.
├── common
│   └── common.html
├── empty
├── fuga
│   └── fuga.html
├── hoge
│   └── hoge.index
└── �\227��\234��\236
    └── �\201\223�\202\223�\201��\201��\201�
        └── hello.txt

しかし、日本語が文字化けしちゃってますね。。。

オプション

[adsense]

日本語文字化け対応

-Nをつけて実効することで日本語が含まれていても文字化けすることなく表示することが可能になります。

日本語文字化け対応
tree -N
.
├── common
│   └── common.html
├── empty
├── fuga
│   └── fuga.html
├── hoge
│   └── hoge.index
└── 日本語
    └── こんにちは
        └── hello.txt

空ディレクトリ非表示

--pruneをつけることで、ファイルが一つも存在しないディレクトリの出力を対象外にすることが可能になります。

除外
tree --prune -N
.
├── common
│   └── common.html
├── fuga
│   └── fuga.html
├── hoge
│   └── hoge.index
└── 日本語
    └── こんにちは
        └── hello.txt

出力階層指定

-L {表示したい階層数}をつけることで、特定の階層までの出力に制御することが可能になります。

出力階層指定
tree -L 2 -N
.
├── common
│   └── common.html
├── empty
├── fuga
│   └── fuga.html
├── hoge
│   └── hoge.index
└── 日本語
    └── こんにちは

相対パス表示

-f {パターン}をつけることで、実行ディレクトリからの相対パスでの出力をすることが可能になります。

除外
tree -f -N
.
├── ./common
│   └── ./common/common.html
├── ./empty
├── ./fuga
│   └── ./fuga/fuga.html
├── ./hoge
│   └── ./hoge/hoge.index
└── ./日本語
    └── ./日本語/こんにちは
        └── ./日本語/こんにちは/hello.txt

パターン指定

-P {パターン}をつけることで、パターンにマッチする情報のみ出力することが可能になります。
正規表現での指定も可能です。
※パターンにマッチするファイルがなくてもディレクトリは表示されてしまいます
なので、--pruneオプションと組み合わせて使いましょう。

除外
tree -P 'fuga.html' -N
.
├── common
├── empty
├── fuga
│   └── fuga.html
├── hoge
└── 日本語
    └── こんにちは

除外

-I {場外対象}をつけることで、特定のディレクトリやファイルを除外して出力することが可能になります。
もちろん、正規表現での指定も可能です。

除外
tree -I 日本語
.
├── common
│   └── common.html
├── empty
├── fuga
│   └── fuga.html
└── hoge
    └── hoge.index

複数除外

複数のファイルやディレクトリを場外したい場合、以下のように実行すると期待通りの出力になりません。

複数除外(失敗)
tree -I common -I 日本語
.
├── common
│   └── common.html
├── empty
├── fuga
│   └── fuga.html
└── hoge
    └── hoge.index

原因としては、-Iオプションは複数指定する場合は-Iオプションを複数つけるのではなく、以下のように除外対象を「|(パイプ)」で区切って指定する必要があります。

複数除外(成功)
tree -I "common|日本語"
.
├── empty
├── fuga
│   └── fuga.html
└── hoge
    └── hoge.index

ディレクトリのみ出力

-dをつけることで、出力結果をディレクトリのみに絞ることが可能になります。

ディレクトリのみ
tree -d -N
.
├── common
├── empty
├── fuga
├── hoge
└── 日本語
    └── こんにちは

隠しファイル出力

-aをつけることで、隠しファイルや隠しフォルダも出力対象に含まれるようになります。
※デフォルトでは出力対象外

隠しファイル出力
tree -a -N
.
├── .DS_Store
├── .private
│   └── security.txt
├── common
│   └── common.html
├── empty
├── fuga
│   └── fuga.html
├── hoge
│   └── hoge.index
└── 日本語
    └── こんにちは
        └── hello.txt

ファイルサイズ出力

-hをつけることで、ファイルサイズも出力対象に含まれるようになります。

隠しファイル出力
tree -h -N
.
├── [ 102]  common
│   └── [   0]  common.html
├── [  68]  empty
├── [ 102]  fuga
│   └── [   0]  fuga.html
├── [ 102]  hoge
│   └── [   0]  hoge.index
└── [ 102]  日本語
    └── [ 102]  こんにちは
        └── [   0]  hello.txt

オーナー情報出力

-uをつけることで、オーナー情報も出力対象に含まれるようになります。

隠しファイル出力
tree -u -N
.
├── [{ユーザー名}  ]  common
│   └── [{ユーザー名}  ]  common.html
├── [{ユーザー名}  ]  empty
├── [{ユーザー名}  ]  fuga
│   └── [{ユーザー名}  ]  fuga.html
├── [{ユーザー名}  ]  hoge
│   └── [{ユーザー名}  ]  hoge.index
└── [{ユーザー名}  ]  日本語
    └── [{ユーザー名}  ]  こんにちは
        └── [{ユーザー名}  ]  hello.txt

グループ情報出力

-gをつけることで、グループ情報も出力対象に含まれるようになります。

隠しファイル出力
tree -g -N
.
├── [{グループ名}   ]  common
│   └── [{グループ名}   ]  common.html
├── [{グループ名}   ]  empty
├── [{グループ名}   ]  fuga
│   └── [{グループ名}   ]  fuga.html
├── [{グループ名}   ]  hoge
│   └── [{グループ名}   ]  hoge.index
└── [{グループ名}   ]  日本語
    └── [{グループ名}   ]  こんにちは
        └── [{グループ名}   ]  hello.txt

ファイル出力

-oをつけることで、出力内容をファイルに書き出すことが可能です。

隠しファイル出力
tree  -o tree -N
cat tree
.
├── common
│   └── common.html
├── empty
├── fuga
│   └── fuga.html
├── hoge
│   └── hoge.index
├── tree
└── 日本語
    └── こんにちは
        └── hello.tx

終わりに

[adsense]

以上のように、手作業でやるにはリスクや手間のかかるところをコマンド一発で正確な情報を作成することが可能になります。

また、今回紹介しきれなかった便利なオプションもまだまだあります。

開発をしている方なら必ず役に立つツールだと思いますので、是非使ってみてください♪