Linux / コマンド / tree - ディレクトリ構造をツリー形式で出力

treeは、ディレクトリとファイルの階層構造をインデント付きのツリー形式で表示するコマンドです。現在のディレクトリ全体をざっと確認したり、出力の深さを制限して特定のファイルだけを選んでプロジェクト構造を確認する際に便利です。

基本インストールから隠しファイルの表示、除外パターン、ファイルサイズや権限の確認、テキスト・JSONへの保存まで、実際によく使う方法を説明します。例はUnix/Linux用のtreeを基準とします。

treeコマンドとは?

treeは指定したディレクトリを再帰的に探索し、ファイルとサブディレクトリの関係を深さに応じてインデントして出力します。ディレクトリを指定しない場合は、現在のディレクトリ.を対象とします。

tree

例えば次のような構造を一目で確認できます。

.
├── README.md
├── config
│   └── app.conf
├── public
│   └── index.html
└── src
    ├── main.py
    └── utils.py

3 directories, 5 files

ls のファイル一覧表示は、基本的には1つのディレクトリの項目を確認するのに適しています。treeは複数段階の包含関係を視覚的に把握する際により便利です。

treeをインストールする

treeはシェル組み込みコマンドではなく、ディストリビューションによっては標準でインストールされていない場合があります。まず次のコマンドでインストールの有無を確認してください。

tree --version

DebianとUbuntu

sudo apt update
sudo apt install tree

Rocky Linux、AlmaLinux、RHELとFedora

sudo dnf install tree

旧バージョンのディストリビューションでdnfの代わりにyumを使用する場合は、sudo yum install treeを使用できます。アクティブなリポジトリにパッケージが存在する必要があります。

Arch Linux

sudo pacman -S tree

基本的な文法と使い方

tree [オプション] [ディレクトリ ...]

現在のディレクトリを出力するには引数なしで実行し、他の場所を確認するにはパスを指定します。複数のディレクトリを一度に指定することも可能です。

tree
tree /etc/nginx
tree ~/projects/app
tree src tests

スペースを含むパスは、1つの引数として渡されるように引用符で囲みます。

tree "Project Files"

出力の最後には、デフォルトで探索したディレクトリとファイルの数が表示されます。この概要が不要な場合は--noreportを使用します。

tree --noreport

対象ディレクトリと出力の深さを指定する

特定のディレクトリ構造を見る

現在の場所を変更せずに確認したいディレクトリを引数として指定できます。

tree /var/www
tree ./src

パスを明示すると、コマンド実行場所と出力対象が分離され、自動化でも意図を理解しやすくなります。

-Lで最大深さを制限する

大きなプロジェクトやシステムディレクトリでは、全体を出力すると結果が非常に長くなる可能性があります。-Lの後に表示する最大深さを指定してください。

tree -L 1
tree -L 2 /var/www
tree -L 3 ~/projects/app

tree -L 2は開始地点から2段階まで表示します。ディレクトリ構造を共有する際は、必要な範囲だけが見えるように、まず深さを制限する方が良いです。

隠し項目とディレクトリの表示を切り替える

-aで隠しファイルを含める

デフォルト出力には、名前がドットで始まる隠しファイルやディレクトリは含まれません。-aを使用すると、.env、.gitignoreのような項目も表示されます。

tree -a
tree -a -L 2

設定ファイル名やディレクトリ構造を外部に共有する際には、機密情報が漏れないか確認してください。-aはファイル内容ではなく名前を出力しますが、その名前自体が機微情報である場合もあります。

-dでディレクトリだけを見る

ファイルを除外してフォルダ構造だけ確認するには-dを使用します。

tree -d
tree -d -L 3 /var/www

プロジェクトのモジュール構成やバックアップディレクトリの配置を素早く説明する時に便利です。

ファイル名で含めたり除外したりする

-Pと-Iのパターンは、シェルが先に展開しないようにシングルクォートで囲むのが安全です。複数のパターンは縦線|で区切ることができます。

-Pで一致するファイルだけ表示

-Pはワイルドカードパターンに一致するファイルだけ選択します。

tree -P '*.py'
tree -P '*.jpg|*.png|*.webp'

フィルタリング後に空に見えるディレクトリを表示から省くには--pruneと一緒に使用します。

tree -P '*.py' --prune

隠しファイルもパターン検査対象に含めるには-aが追加で必要です。

-Iで不要な項目を除外する

-Iはパターンに一致するファイルとディレクトリを出力から除外します。依存関係、ビルド結果、キャッシュディレクトリを隠すとプロジェクト構造が非常に簡潔になります。

tree -I 'node_modules|.git|dist|__pycache__'
tree -L 3 -I '*.log|tmp|cache'

-Iはファイルを削除せず、表示対象からのみ除外します。

--gitignoreでGit除外ルールを使用する

サポートされているバージョンでは--gitignoreを使って.gitignoreおよびGit除外ファイルのルールをフィルタに活用できます。

tree --gitignore
tree -a --gitignore -L 3

インストールされたバージョンがこのオプションをサポートしているかはtree --helpで確認してください。--gitignoreを使用しても、リポジトリ構造を外部に共有する前に出力内容を直接確認する必要があります。

サイズ、権限および修正時間を表示する

ファイルサイズとディレクトリ累積サイズの表示

-sはバイト単位のサイズを表示し、-h は単独でも読みやすい単位のサイズを表示します。

tree -s
tree -h

--duは各ディレクトリに含まれるファイルとサブディレクトリのサイズを累積して計算します。読みやすい単位を希望する場合は、-hを一緒に使用します。

tree --du -h -L 2

--duは対象範囲のツリーを出力前に読み込み、サイズを計算するため、大きなディレクトリでは時間がかかり、メモリ使用量が多くなることがあります。

集計するのはファイルサイズであり、du の既定の割り当て量と同一とは限りません。上流 2.3.2 の実装では深さ制限を超えて探索しないため、-L や除外条件を指定した結果を全ファイルの完全な使用量と解釈しないでください。

権限、所有者と時間の表示

-pは権限を、-uは所有者を、-gはグループを表示します。-Dを追加すると、最終更新時間も確認できます。

tree -p
tree -pug
tree -pugD -L 2

権限の問題を調査する際に、構造とメタデータを一緒に見ることができますが、非常に長いユーザー名やパスがある場合、出力の幅が広くなることがあります。

ソート順とパス表示の変更

ディレクトリを先に表示して並べ替える

--dirsfirstはディレクトリをファイルより先に配置します。 -tは修正時間、--sort=sizeはサイズを基準に並べ替え、-rは結果の順序を逆にします。

tree --dirsfirst
tree -t
tree --sort=size -r

ファイルシステムに保存されている順序をそのまま使用し、並べ替えコストを減らすには-Uを使用できます。この場合、--dirsfirstは無効になります。

パス付きの簡潔なリストを作成する

-fは各項目の前に指定した起点を含むパスの接頭辞を表示します。-iは枝型のインデント線を削除します。

tree -f
tree -fi --noreport

-f は指定した起点を前置するため、起点が相対パスなら結果も相対パスになります。必ず絶対パスになるわけではありません。他のコマンドで読み取るための単純なパスリストが必要な場合、-fi --noreportの組み合わせが便利です。ただし、ファイル名に改行などの特殊文字が含まれている場合は、単純なテキスト解析が安全でないことがあります。

結果をファイルと構造化形式で保存する

テキストファイルとして保存する

既存の出力ファイルがあれば上書きされるため、保存先を確認してください。対象ディレクトリ内に保存すると、そのレポート自体が一覧に含まれることもあります。必要なら対象外へ保存するか、出力ファイル名を除外します。

-oは出力結果を指定したファイルに送ります。

tree -L 3 -o directory-structure.txt
tree -a -I '.git|node_modules' --noreport -o project-tree.txt

シェルリダイレクションを使用することもできます。色制御文字がファイルに混ざらないように-nで色を無効にできます。

tree -n -L 3 > directory-structure.txt

JSONおよびXMLで出力

-JはJSON、-XはXML形式で出力します。後続のプログラムで構造を解析したり変換したりする際に使用できます。

tree -J -L 3 > directory-structure.json
tree -X -L 3 > directory-structure.xml

構造化出力形式および提供されるフィールドは、インストールされているtreeのバージョンによって異なる場合があるため、受け取るプログラムを作成する際には実際の出力を先に確認してください。

シンボリックリンクとファイルシステム境界の扱い

シンボリックリンクを辿るかどうかの決定

基本的にシンボリックリンクはリンク名と対象パスを表示しますが、リンク先のディレクトリには入っていきません。-lを使用すると、ディレクトリを指すシンボリックリンクを辿ります。

tree -l -L 3

リンクをたどることで予想以上の経路を探索できるので、深さ制限を併用する方が安全です。ツールは循環リンクを検出した場合に、その先への再帰的な探索を避けますが、出力範囲と処理時間は自分で確認してください。

-xで現在のファイルシステム内のみ閲覧

-xは開始ディレクトリとは異なるファイルシステムへの探索を避けます。同じファイルシステムの bind mount などを一律に遮断する機能ではありません。これは、マウントポイントが多いサーバーでのナビゲーション制限時に有用です。

tree -x -L 3 /

ルートディレクトリをターゲットにしても、アクセス権のないパスは完全には読み取れず、システム構造全体を出力すると結果が非常に大きくなることがあります。

よく使うtreeコマンドの組み合わせ

コマンド 用途
tree 現在のディレクトリ内のファイルやサブディレクトリを木構造として表示します。
tree -L 2 開始位置から2階層まで表示します。
tree -a また、隠しファイルや隠しディレクトリも含まれています。
tree -d ファイルを除外してディレクトリのみ表示します。
tree -I 'node_modules|.git' 指定したパターンのファイルとディレクトリを除外します。
tree -P '*.py' --prune Pythonファイルがある枝を中心に表示します。
tree -h --du -L 2 二段階までディレクトリの累積サイズを読みやすい単位で表示します。
tree -pugD 権限、ユーザー、グループおよび修正時間を一緒に表示します。
tree -fi --noreport 枝の線や要約なしでパスの一覧を作成します。
tree -J -L 3 三段階までの構造をJSONで出力します。

主なオプションまとめ

オプション 説明
-a ドットで始まる隠しファイルおよびディレクトリを含みます。
-d ディレクトリのみを表示します。
-L 数字 表示する最大ディレクトリの深さを制限します。
-P パターン ワイルドカードパターンに一致するファイルを選択します。
-I パターン ワイルドカードパターンに一致するファイルとディレクトリを除外します。
--prune フィルター適用後、空のディレクトリを出力から削除します。
--gitignore Git除外ファイルのルールをフィルターに使用します。
-f 各ファイル名の前に指定した起点を含むパスの接頭辞を表示します。
-h ファイルサイズを読みやすい単位で表示します。
--du ディレクトリごとの累積サイズを計算します。
-p ファイルの種類と権限を表示します。
-D 最終更新時刻を表示します。
--dirsfirst ディレクトリをファイルより先に並べます。
-J JSON形式で出力します。
-X XML形式で出力します。
-o ファイル 出力を指定したファイルに保存します。
-l ディレクトリを指すシンボリックリンクをたどります。
-x 開始位置と同じファイルシステム内でのみ探索します。
--noreport 最後のファイルとディレクトリの数の要約を省略します。

大きなディレクトリで使用する際の注意点

まず深さとフィルターを制限する

ルートディレクトリ、ユーザーホーム全体、または大規模な依存ディレクトリを制限なく探索すると、出力と処理時間が大幅に増加します。まず-Lで深さを制限し、-Iまたは--gitignoreで不要な枝を除外してください。

--duと--pruneの処理コストを理解する

--duと--pruneは結果を出す前に全ツリーをメモリに集める必要があるかもしれません。非常に大きなディレクトリでは、出力が始まるまで遅延し、メモリ使用量も増加する可能性があります。

権限エラーと機密性の高い名前を確認する

現在ユーザーに読み取りまたは検索権限のないディレクトリは、完全には表示されません。単純に全体の構造を見るために管理者権限で実行するとアクセス範囲が不必要に広がる可能性があるため、まず必要なパスと権限を確認してください。

出力ファイルを文書やイシューに添付する前に、ユーザー名、内部サーバーパス、秘密ファイル名、プロジェクトコード名が含まれていないか確認する必要があります。

FAQ

tree: command not found エラーが出る理由は何ですか?

treeがインストールされていないか、実行ファイルパスがPATHにないためです。使用しているディストリビューションのパッケージマネージャでtreeパッケージをインストールした後、tree --versionで確認してください。

サブディレクトリを二段階までしか表示しないにはどうすればよいですか?

tree -L 2を使用します。別のパスを確認するには、tree -L 2 /確認する/パスのようにディレクトリを後ろに指定してください。

node_modulesと.gitディレクトリを一度に除外できますか?

tree -I 'node_modules|.git'を使用します。パターンをシングルクォートで囲むと、シェルがパイプやワイルドカードを先に解釈することを防ぐことができます。

tree の結果を README に入れやすい形にするにはどうすればいいですか?

tree -L 3 -I '.git|node_modules|dist' --noreport のように深さや除外対象を制限してください。結果に内部パスや機密ファイル名が含まれていないことを確認した後、コードブロックに入れると構造が維持されます。

参考資料