Mac で treeコマンドを使った時のメモ（grepコマンドとの組み合わせも）

タイトルの通りです。
Mac内の、とあるフォルダ内の階層構造を可視化したり、特定の名前のものを抽出する際に、treeコマンドを使った時のメモになります。

## Homebrew でインストール
まずは、Mac の標準コマンドで treeコマンドがないため、インストールします。
Homebrew をお使いの場合は、以下の 1行でインストール完了です。

```bash
$ brew install tree
```

## コマンドを使った色々な出力
### 用意したテスト用のフォルダ・ファイル
今回、テスト用のフォルダ・ファイルを用意しました。
具体的には、以下のような構造です。
![treeコマンドで全体を表示.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/f4f6500e-a804-e007-664c-9208bc4d15bb.jpeg)

### 日本語の文字化けを防ぐ（-N オプション）
上で示した全体構成は、treeコマンドでオプションをつけて出力したものです。

単純に treeコマンドを実行すると、以下のような出力になります。

```
.
├── Mac�\201��\202\231tree�\202��\203\236�\203��\203\210�\202\231
│   ├── 2�\232\216層�\233�1
│   │   └── test3.txt
│   ├── 2�\232\216層�\233�2
│   ├── 2�\232\216層�\233�3
│   └── test2.txt
└── test.txt
```

そこで、以下のように「-N」のオプションを使います。

```bash
$ tree -N
.
├── Macでtreeコマンド
│   ├── 2階層目1
│   │   └── test3.txt
│   ├── 2階層目2
│   ├── 2階層目3
│   └── test2.txt
└── test.txt
```

無事、日本語を文字化けせることなく表示できました。

#### 参照したもの
●treeコマンドで文字化けを防ぐ (+他のオプション) - 備忘録置いとく
　https://fhiyo.github.io/2017/08/31/fix-character-corruption-of-tree-command.html

### フォルダだけを表示させる（-d オプション）
今度は、フォルダのみを表示さえてみます。
以下のように「-d」のオプションを使えば OK です。

```bash
$ tree -N -d
.
└── Macでtreeコマンド
    ├── 2階層目1
    ├── 2階層目2
    └── 2階層目3
```

#### 参照したもの
●【 tree 】コマンド――ディレクトリをツリー状に表示する：Linux基本コマンドTips（179） - ＠IT
　https://atmarkit.itmedia.co.jp/ait/articles/1802/01/news025.html

### 表示する階層を限定する（-L オプション）
次に、特定の階層までを表示対象にして試してみます。
1階層目だけを対象にして実行してみます。

以下のように「-L」のオプションを使います。

```bash
$ tree -N -d -L 1
.
└── Macでtreeコマンド
```

```bash
$ tree -N -L 1
.
├── Macでtreeコマンド
└── test.txt
```

### 特定の名前のものだけ出力する（-P　オプション）
次は、特定の名前のものだけをとりだす、ということをやってみます。

#### ファイル名で絞り込み
ファイルの名前が「test」で始まるものだけを取り出してみます。

この場合は、以下のように「-P」のオプションを使います。

```bash
$ tree -N -P 'test*'
.
├── Macでtreeコマンド
│   ├── 2階層目1
│   │   └── test3.txt
│   ├── 2階層目2
│   ├── 2階層目3
│   └── test2.txt
└── test.txt
```

上記だと、該当するファイルが置かれていないフォルダも表示対象となるようです。
該当するファイルを含まないフォルダを除外するには「--prune」を加えると良いようです。

```bash
 tree -N -P 'test*' --prune
.
├── Macでtreeコマンド
│   ├── 2階層目1
│   │   └── test3.txt
│   └── test2.txt
└── test.txt
```

これで、名前が test で始まるファイルを含まないフォルダが、表示対象から除外されました。

### grepコマンドと組み合わせてみる
特定の内容を抽出するために、grepコマンドとの組み合わせを試してみます。

#### 特定の名前のものを抽出
試しに、ファイル名・フォルダ名に特定の数字を含むもののみ抽出する、ということをやってみます。

以下は、フォルダ名に「3」という文字を含むもののみ抽出したものです。

```bash
$ tree -d -N | grep 3
    └── 2階層目3
```

次は、日本語を含むもので試してみます。
「目2」という文字を含むものを対象としました。

```bash
$ tree -N | grep 目2
│   ├── 2階層目2
```

#### 特定の名前のものの数を出力
続いて、特定の文字を含む名前のものの数を出力してみます。
grepコマンドで「-c」のオプションを使います。

```bash
$ tree -N | grep -c 2
4
```

上記の結果を得られました。
ちなみに、「-c」をつけない場合は以下となります。

```bash
$ tree -N | grep 2
│   ├── 2階層目1
│   ├── 2階層目2
│   ├── 2階層目3
│   └── test2.txt
```

#### 特定の文字列を含まないものを抽出
以下は「-v」のオプションを使い、特定の文字列を含まない行を表示させた例です。

```bash
$ tree -N | grep -v txt
.
├── Macでtreeコマンド
│   ├── 2階層目1
│   ├── 2階層目2
│   ├── 2階層目3

4 directories, 3 files
```

#### 特定の文字列を含むもの/含まないものを OR条件で抽出
grepコマンドで OR条件で複数の条件指定をする場合、というのを試します。

```bash
$ tree -N | grep -e 階層 -e 3
│   ├── 2階層目1
│   │   └── test3.txt
│   ├── 2階層目2
│   ├── 2階層目3
4 directories, 3 files
```

ちなみに AND条件の場合は、このような形です。

```bash
$ tree -N | grep  階層 | grep  3
│   ├── 2階層目3
```

#### 特定の名前のものを抽出（正規表現を利用するバージョン）
次は、grepコマンドの条件の部分に正規表現を使ってみます。

とりあえず最初は、数字を含むもののみを対象として出力してみました。
以下は上から順に、「1 から 9　を含むもの」、「1 から 2 を含むもの（範囲指定）」、「1 か 3 を含むもの」となっています。

```bash
$ tree -N | grep -E '[1-9]'
│   ├── 2階層目1
│   │   └── test3.txt
│   ├── 2階層目2
│   ├── 2階層目3
│   └── test2.txt
4 directories, 3 files
```

```bash
$ tree -N | grep -E '[1-2]'
│   ├── 2階層目1
│   ├── 2階層目2
│   ├── 2階層目3
│   └── test2.txt
```

```bash
$ tree -N | grep -E '[1|3]'
│   ├── 2階層目1
│   │   └── test3.txt
│   ├── 2階層目3
4 directories, 3 files
```

#### 参照したもの
●grepでこういう時はどうする? - Qiita
　https://qiita.com/hirohiro77/items/771ffb64dddceabf69a3

●grepでAND検索とOR検索 - Qiita
　https://qiita.com/ritukiii/items/968f17f9c308743e85a7