tree コマンド入門 - ディレクトリ構造をツリー表示する

tree コマンド入門 - ディレクトリ構造をツリー表示する

この記事でできるようになること

  • `tree` でディレクトリ構造を枝分かれの図として表示できる
  • `-L` で深さを制限し、巨大なフォルダでも読める形で表示できる
  • `-d` `-a` `-I` を組み合わせて、必要なものだけに絞り込める

前提知識(先に読むと理解しやすい記事)

この記事で解決できること

対象読者:Linux 入門者。lscd でフォルダの中を行き来するのに疲れた方。

言葉の整理

  • ディレクトリ:Windows や Mac でいうフォルダのことです。「フォルダ」「ディレクトリ」は同じものを指します。
  • 階層:フォルダの中にフォルダがある入れ子の深さのことです。「レベル」とも呼びます。
  • 隠しファイル:名前が . から始まるファイルです。既定では一覧に出ません。「ドットファイル」とも呼びます。
  • オプション:コマンドの後ろに付ける -L のような指定です。動きを変えるための指示です。
  • カレントディレクトリ:いま自分がいるディレクトリのことです。「現在地」と読み替えて構いません。
  • シェル入力したコマンドを解釈してコンピュータに実行させる対話プログラム。:ターミナルであなたの入力を受け取るプログラムです。「シェル」「ターミナル」「コンソール」はほぼ同じものを指す別の呼び方です。
  • クォート文字列を引用符(' や ")で囲むこと。スペースなどを含む値をひとまとまりとして扱える。' で文字列を囲むことです。囲むと、記号がそのままの文字として渡ります。

tree は表示するだけのコマンドです。ファイルを消したり書きかえたりしません。何度実行してもフォルダの中身は変わりません。安心して試してください。

導入:リナの「ls 迷子」事件

リナ: ライニー先輩、プロジェクトのフォルダの構造を確認したいです。
リナ: でも ls して cd して、また ls して、の繰り返しです。全体像が頭に入ってきません。
ライニー先輩: いわゆる「ls 迷子」だね。一段ずつ潜って戻ってを繰り返すと、いま自分がどこにいるか分からなくなるよね。
リナ: そうなんです。紙に書き出したくなります。
ライニー先輩: その「紙に書き出した図」を一発で出してくれるのが tree コマンドだよ。ディレクトリの中身を 枝分かれの図 で表示してくれるんだ。

結論を先に

  • tree = ディレクトリ構造を ツリー(枝分かれ図)で可視化 するコマンド
  • そのまま tree で現在地以下を表示、tree パス で場所を指定
  • 巨大フォルダは tree -L 2(深さ制限)と tree -I 'node_modules'(除外)が必須

1. tree とは何か?

結論: tree はディレクトリの中身を枝分かれの図で表示するコマンド。ls を何度も叩かなくても階層構造が一目で分かる。

リナ: treels と何が違うんですか?
ライニー先輩: lsその場所の中身だけ を一覧にするね。treeその下の階層をすべて辿って、枝分かれの図で見せてくれるんだ。
リナ: つまり ls を全部のフォルダで自動的に実行してくれる、ということですか。
ライニー先輩: そのイメージで合っているよ。しかも親子関係が線でつながって見える。
ライニー先輩: だから「この設定ファイルはどのフォルダの下にあるか」がすぐに分かるんだ。

実際に表示すると、次のようになります。

.
├── README.md
├── src
│   ├── index.js
│   └── utils
│       └── format.js
└── tests
    └── index.test.js

3 directories, 4 files

図の読み方

  • ├── └──:その階層にあるファイルやフォルダです。└── は最後の 1 つを表します
  • :枝が下に続いていることを示す縦線です
  • 字下げの深さ:そのまま階層の深さを表します
  • 最後の行:ディレクトリ数とファイル数の合計 です

2. インストール

結論: tree は標準では入っていないことが多い。apt / dnf でインストールする。

リナ: さっそく使いたいです。どうやって入れるんですか?
ライニー先輩: ディストリビューションによっては、最初から入っていないことがあるんだ。
ライニー先輩: tree と打って「command not found」が出たら、インストールしよう。
# Ubuntu / Debian 系
$ sudo apt install tree

# RHEL / Fedora 系
$ sudo dnf install tree

# macOS(Homebrew)
$ brew install tree

パッケージ名は、どのディストリビューションでも tree で共通です。インストールが終わったら tree --version でバージョンを確認できます。

3. 基本の使い方

結論: 引数なしの tree でカレントディレクトリ以下を表示。tree パス で対象の場所を指定する。

ライニー先輩: 使い方はとても簡単だよ。まずは何も付けずに実行してみよう。

カレントディレクトリを表示

# いまいる場所の中身をツリー表示
$ tree

場所を指定して表示

# 指定したディレクトリを表示
$ tree /etc

# ホームディレクトリを表示
$ tree ~
リナ: tree と打っただけで、フォルダの奥の奥まで全部出てきました。

リナの失敗:画面が流れて止まらない

リナ: プロジェクトのフォルダで tree を実行しました。画面が滝のように流れて、最後の行しか残っていません。
$ tree
(数万行が流れたあと)

12043 directories, 98217 files
リナ: えっ、9 万ファイル以上ありました。私のプロジェクトはそんなに大きくないはずです。壊れたんでしょうか。
ライニー先輩: 壊れてないよ。tree既定で一番下の階層まで全部 辿るんだ。だから node_modules のような巨大なフォルダも、中身を 1 つ残らず表示してしまう。
リナ: 見たかったのは自分の書いたファイルだけです。数のほとんどはライブラリでした。
ライニー先輩: そう。だから深さを -L で制限して、不要なフォルダを -I で外す。この 2 つを覚えれば、いつでも読める量に収まるよ。
リナ: 納得しました。まず -L 2 で全体を見てから、深掘りします。
$ tree -L 2 -I 'node_modules|.git'

流れてしまった画面は tree | less と書くと、1 画面ずつ止めて読めます。less の中では矢印キーで動き、q で終了します。

4. 深さを制限する(-L)

結論: tree -L 数字 で表示する階層の深さを制限できる。巨大なフォルダはまず -L 1-L 2 で全体像を掴む。

リナ: さっきのように出しすぎないようにするには、どうしたらいいですか?
ライニー先輩: -L(Level)を使うよ。-L 2 なら 2 階層目まで しか表示しない。
ライニー先輩: これなら全体像だけを短時間で確認できるね。
# 1階層だけ(直下の中身のみ、ls に近い)
$ tree -L 1

# 2階層まで
$ tree -L 2 /var/log
/var/log
├── apt
│   ├── history.log
│   └── term.log
├── journal
├── syslog
└── dpkg.log

2 directories, 4 files

-L の使いどころ

  • 初めて見るフォルダは tree -L 1 から始めます。次に -L 2浅いところから 深掘りします
  • 深さは 1 以上の整数で指定します(-L 0 はエラーになります)
  • 全体の地図が欲しいときは浅く指定します。特定フォルダの詳細を見たいときは深く指定します

5. 表示するものを絞り込む

結論: -d でディレクトリのみ、-a で隠しファイルも表示、-I で不要なフォルダを除外できる。

ライニー先輩: 深さの次は「何を表示するか」を絞る方法だね。これを覚えると tree が一気に実用的になるよ。

ディレクトリだけ表示(-d)

# フォルダ構造だけを把握したいとき
$ tree -d -L 2
リナ: ファイルが多すぎるとき、フォルダの骨組みだけを見たいです。そのときに便利そうですね。
ライニー先輩: そのとおり。-d(directory)はファイルを全部隠すよ。フォルダの骨格だけ を見せてくれるんだ。
ライニー先輩: プロジェクトの構成を説明するときに役立つよ。

隠しファイルも表示(-a)

# .git や .env などドット始まりも表示
$ tree -a -L 1

tree はデフォルトで隠しファイルを表示しない

.bashrc.git のような ドット(.)で始まるファイル は、-a(all)を付けないと表示されません。

「設定ファイルが見当たらない」ときは、-a を付け忘れていないか確認してください。

不要なフォルダを除外(-I)

# node_modules を除外して表示
$ tree -I 'node_modules'

# 複数を | で区切って除外
$ tree -I 'node_modules|.git|dist'
リナ: node_modules は中身が何万ファイルもありますよね。さっき画面が流れた原因もこれでした。
ライニー先輩: そう。だから -I(Ignore)で除外するのが定番だよ。
ライニー先輩: パターンは |(パイプ)で区切れば複数を指定できる。node_modules .git dist あたりは除外の常連だね。

逆に「これだけ見たい」なら -P

特定のパターンだけを表示したいときは -P(Pattern)を使います。tree -P '*.js' と書けば .js ファイルだけが残ります。

空のフォルダが邪魔なときは --prune を一緒に付けてください。該当ファイルを含まないフォルダが消えて見やすくなります。

6. 見やすく・サイズ付きで表示する

結論: -F で種類の記号付き、-h --du でディレクトリの合計サイズ付き、-o ファイル でファイルに保存できる。

リナ: もう少し情報を足したいときはありますか?
ライニー先輩: あるよ。ファイルの種類やサイズを一緒に出すと、調査がぐっと楽になるんだ。

種類が分かる記号を付ける(-F)

# ディレクトリに / 、実行ファイルに * を付ける
$ tree -F -L 1

ls -F と同じ記号が付きます。末尾が / ならフォルダ、* なら実行可能ファイルです。一目で見分けられます。

サイズを表示する(-h / --du)

# 各ファイルのサイズを人間が読みやすい単位で
$ tree -h

# ディレクトリのサイズ(配下の合計)も表示
$ tree -h --du -L 1

--du の意味

--du は各ディレクトリのサイズを 配下にあるファイルの合計 として表示します。du コマンドと同じ考え方です。

-h(human readable)と組み合わせると 1.2K 3.4M のような読みやすい単位になります。どのフォルダが容量を使っているかを、おおまかに知りたいときに便利です。

リナ: サイズが見られるなら、ncdu のように容量調査にも使えますか?
ライニー先輩: その時点の記録としては使えるよ。ただし矢印キーで掘り下げたり、その場で消したりはできない。
ライニー先輩: そういう 対話的な調査ncdu の方が向いている。tree は構造を図で残す道具、ncdu は容量を探して掃除する道具、と考えるといいよ。

結果をファイルに保存(-o)

# ツリーをテキストファイルに書き出す
$ tree -L 2 -o structure.txt

README に「ディレクトリ構成」を載せるときに便利です。tree -L 2 の出力をそのまま貼れば、構成図が一瞬で作れます。

不要なものは -I で除外してから貼ってください。読みやすい図になります。

なお -o は指定した名前のファイルを新しく作り、そこに結果を書き込みます。同じ名前のファイルがある場合は中身が置きかわります。実行する前に ls で同名ファイルがないか確認してください。

7. ミニ課題:自分の環境で試してみよう

結論: 深さ制限・ディレクトリのみ・除外指定の3問で tree の実用オプションを定着させる。

リナ: 知識は入りました。手を動かして試したいです。
ライニー先輩: いいね、3 問用意したよ。tree は表示するだけだから、何度実行しても大丈夫だよ。

課題 1: ホームディレクトリの直下に何があるかを、1 階層だけ表示して確かめよう。

ヒント 1(方向づけ)を見る

深さを制限するオプションを使います。今回は「直下だけ」なので、いちばん浅い指定にします。

英語の Level が手がかりです。

ヒント 2(コマンド名)を見る

使うのは tree です。深さの制限は -L に数字を続けて書きます。今回は 1 です。

ホームディレクトリは ~ と書けます。

答えを見る
$ tree -L 1 ~
/home/user
├── Documents
├── Downloads
├── Videos
└── notes.txt

3 directories, 1 file

-L 1 に制限すると、ls と同じ範囲がツリーの形で並びます。

課題 2: ホーム以下のフォルダの骨組みだけを、2 階層まで表示しよう。ファイルは出さないようにします。

ヒント 1(方向づけ)を見る

2 つのオプションを組み合わせます。1 つは深さの制限です。もう 1 つはファイルを隠す指定です。

ファイルを隠す方は、英語の directory が手がかりです。

ヒント 2(コマンド名)を見る

深さは -L 2 です。ディレクトリだけにするのは -d です。2 つとも tree の後ろに並べて書けます。

答えを見る
$ tree -d -L 2 ~
/home/user
├── Documents
│   └── work
├── Downloads
└── Videos

4 directories

-d でファイルが消え、-L 2 で深さが 2 階層に収まります。最後の行もディレクトリ数だけになります。

課題 3: プロジェクトのフォルダで .git を除外して表示し、消えたことを確かめよう。

ヒント 1(方向づけ)を見る

見せたくないフォルダの名前を、コマンドに伝えます。深さの制限とは別のオプションです。

英語の Ignore が手がかりです。

ヒント 2(コマンド名)を見る

使うのは tree -I です。-I の後ろに、除外したい名前をクォートで囲んで書きます。

囲まずに書くと、| がシェルのパイプと解釈されます。

答えを見る
$ tree -a -L 1 -I '.git'
.
├── README.md
├── src
└── tests

2 directories, 1 file

-a を付けても .git は出てきません。除外が効いている証拠です。

複数を除外したいときは '.git|node_modules' のように | で区切ります。

8. よくある落とし穴

結論: 深さ無制限で巨大フォルダを叩く、隠しファイルの表示忘れ、除外パターンのクォート忘れに注意。

やりがちな失敗 3 つ

  1. 大きいフォルダで -L なしで実行する → 画面が滝のように流れます。まず -L 1-L 2 から始めます
  2. 隠しファイルが見えず焦るtree は既定で . 始まりを隠します。-a の付け忘れを確認します
  3. 除外パターンをクォートし忘れる| がシェルのパイプと解釈されます。-I 'node_modules|.git' のように囲みます

安全で使いやすい型

  • 初めて見るフォルダ:tree -L 2(浅く全体像を見ます)
  • 構成を説明したい:tree -d -L 2(骨組みだけを出します)
  • リポジトリを見る:tree -L 2 -I 'node_modules|.git|dist'(不要なものを除外します)

9. 振り返り

リナ: 整理します。treels と違って、下の階層まで辿って図にしてくれるんですね。
ライニー先輩: そのとおり。だから既定のままだと、巨大なフォルダで画面が流れてしまう。
リナ: そこで -L で深さを止めて、-I で不要なフォルダを外すんでした。
ライニー先輩: よく覚えていたね。初めて見るフォルダは -L 2 から。この 1 手で読める量に収まるよ。

今日の 3 行まとめ

  1. tree はディレクトリ構造を枝分かれの図で表示する。ls の繰り返しが 1 回で済む
  2. -L 数字 で深さを制限する。初めて見るフォルダは -L 2 から始める
  3. -d はフォルダだけ、-a は隠しファイルも表示、-I 'パターン' は除外に使う

次に読む

この記事を共有

次の一手