---
title: "ファイルツリーを一覧表示するZsh関数"
description: "コマンドラインでディレクトリを移動していると、ディレクトリとサブディレクトリの構造を「ツリー」形式で確認できると便利なことがよくあります。treeのようなツールは数多くありますが…"
canonical: https://oozou.com/til/zsh-function-to-list-file-tree-17
locale: ja
date: 2020-10-13
topic: shell
---

# ファイルツリーを一覧表示するZsh関数

> コマンドラインでディレクトリを移動していると、ディレクトリとサブディレクトリの構造を「ツリー」形式で確認できると便利なことがよくあります。treeのようなツールは数多くありますが…

Published: 2020-10-13 · Topic: [shell](https://oozou.com/ja/til-topics/shell) ([markdown](https://oozou.com/ja/til-topics/shell.md))

コマンドラインでディレクトリを移動していると、ディレクトリとサブディレクトリの構造を「ツリー」形式で確認できると便利なことがよくあります。treeのようなツールは数多くありますが、シェルに直接組み込めるシンプルな自作ソリューションが欲しくなることもあるでしょう。この記事では、ディレクトリ構造をツリー形式で一覧表示するシンプルな **Zsh** 関数の作り方を紹介します。

# ファイルツリーを一覧表示するZsh関数を作る

デフォルトシェルとして **Zsh** を使っているなら、.zshrc ファイルにカスタム関数を追加することで、ディレクトリをツリー構造で表示する手早く効率的なコマンドを作れます。この関数は人気の tree コマンドと同じように動作しますが、**ls** と **sed** で構築されているため、Zsh環境に直接組み込むのが簡単です。

**ステップ1：lst() 関数を .zshrc に追加する**

最初のステップは、.zshrc ファイルの中に lst() 関数を定義することです。この関数は任意のディレクトリパスをオプション引数として受け取り、その地点からのディレクトリツリーを一覧表示します。ディレクトリを指定しない場合は、カレントディレクトリがデフォルトになります。  

好みのテキストエディタで .zshrc ファイルを開き、次の関数を追加します。

```zsh
lst() {
    if [ "$1" != "" ] # or better, if [ -n "$1" ]
    then
        ls -R $1 | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/   /' -e 's/-/|/'
    else
        ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/   /' -e 's/-/|/'
    fi
}
```

**ステップ2：Zshの設定を再読み込みする**

関数を追加したら、変更を反映させるために .zshrc ファイルを再読み込みする必要があります。ターミナルで次のコマンドを実行します。

```
sh
source ~/.zshrc
```

**ステップ3：lst() 関数を使う**

.zshrc に関数を追加すれば、すぐに使い始められます。lst() 関数を使うと、指定したディレクトリ内のすべてのサブディレクトリをツリー形式で一覧表示できます。使い方は次のとおりです。

フォルダ（例：spec）のサブディレクトリを一覧表示するには、次を実行します。

```
sh
lst spec
```

このコマンドは、specフォルダ内のすべてのサブディレクトリを一覧表示するツリー状の構造を生成します。

カレントディレクトリのツリー構造を見たい場合は、次を実行するだけです。

```
sh
lst
```

lst() 関数はフォルダ構造を出力するので、ディレクトリの階層を把握しやすくなります。  

**出力例**

次のようなディレクトリ構造があるとします。

```
bash
spec/
├── controllers/
│   └── users/
├── models/
└── views/
```

lst spec コマンドを実行すると、次のような出力が得られます。

```
css
   spec
   |--controllers
   |   |--users
   |--models
   |--views
```

このシンプルなツリー構造のおかげで、ディレクトリとサブディレクトリの関係を視覚的に把握しやすくなります。  

**仕組み**

関数をステップごとに見ていきましょう。

1. **ls -R $1**：ls -R コマンドはディレクトリ（引数が指定されていなければカレントディレクトリ）の内容を再帰的に一覧表示します。
2. **grep ":$"**：結果をディレクトリ名（: で終わる行）だけにフィルタリングします。
3. **sed コマンド**：
   - **'s/:$//'**：各ディレクトリ名の末尾のコロンを取り除きます。
   - **'s/[^-][^\/]\*\//--/g'**：スラッシュ（/）をダッシュ（--）に置き換え、構造をツリー状の形式に変換します。
   - **'s/^/ /'**：ディレクトリツリーにインデントを追加します。
   - **'s/-/|/'**：ダッシュを縦のパイプ（|）に置き換え、ツリー形式をさらに整えます。

**ステップ4：lst() 関数をカスタマイズする**

lst() 関数は必要に応じて簡単にカスタマイズできます。たとえば、ツリー構造のフォーマットを変えたり、ファイルを一覧表示するためのオプションを追加したりできます。ディレクトリだけでなくファイルも頻繁に一覧表示したい場合は、ディレクトリのみを表示する grep フィルタを取り除いて、ファイルも含めるように関数を変更するとよいでしょう。  

**代替手段：tree コマンドを使う**

お好みであれば、ディレクトリ構造の表示専用に設計された tree コマンドを使うこともできます。tree は広く利用できるユーティリティで、ほとんどのUnix系システムにインストールできます。tree をインストールするには、システムに応じて次のいずれかのコマンドを使います。  

**UbuntuやDebian系のシステムの場合**：

```
sh
sudo apt-get install tree
```

**macOSの場合**：

```
sh
brew install tree
```

インストールしたら、tree コマンドで同様の出力を生成できます。

```
sh
tree spec
```

tree コマンドには、ファイルサイズやパーミッションの表示など、より多くの機能が最初から備わっています。とはいえ、シンプルに保ちたい場合や tree が使えない場合には、lst() 関数は軽量で優れた代替手段です。

**まとめ**

今回作成した **Zsh関数** は、ディレクトリ構造をツリー形式で一覧表示するシンプルで効率的な方法を提供します。lst() 関数を .zshrc ファイルに追加すれば、システム上の任意のフォルダのサブディレクトリを素早く視覚化できます。これは、複雑なディレクトリ構造を移動したり、プロジェクト内のファイルとフォルダの階層を理解したりするのに非常に役立ちます。

より多くの機能が必要なら、高度な機能を備えた tree コマンドの利用を検討してください。ただし、Zshシェルに直接組み込める軽量なカスタムソリューションとしては、lst() 関数は最適な選択肢です。

# 

---

# よくある質問

**1. lst() 関数は何のためのものですか？**

lst() 関数は、ディレクトリ構造をツリー形式で表示するカスタムZsh関数です。ls と sed を使って出力をフォーマットし、ターミナル上でフォルダ階層を視覚的に把握しやすくします。

**2. lst() 関数をZshの設定に追加するには？**

.zshrc ファイルを編集して関数定義を貼り付ければ追加できます。その後、source ~/.zshrc を実行して設定を再読み込みすると、関数が使えるようになります。

**3. lst() 関数の出力はカスタマイズできますか？**

はい。出力をフォーマットしている sed コマンドを変更することでカスタマイズできます。ツリー構造を変えたり、詳細を追加したり、ファイルを一覧に含めたりすることもできます。

**4. lst() 関数の代わりになるものはありますか？**

tree コマンドは、ディレクトリ構造をツリー形式で表示する、広く利用できるユーティリティです。lst() 関数より多くの機能を備えており、ほとんどのUnix系システムにインストールできます。

**5. lst() 関数はZsh以外のシステムでも使えますか？**

lst() 関数はZsh向けに書かれていますが、適切な設定ファイル（Bashなら .bashrc）に追加することで、Bashなど他のシェルにも簡単に適応できます。

lst() 関数をZshのワークフローに組み込めば、コマンドライン体験が向上し、ディレクトリの移動がずっと楽になります。

---

Contact OOZOU: hello@oozou.com · +66 2544 0000 · https://oozou.com/ja/contact

More for AI agents: https://oozou.com/llms.txt · every page has a markdown twin at its URL plus ".md"
