LoginSignup
4

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-12-19

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

Homebrew でインストール

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

$ brew install tree

コマンドを使った色々な出力

用意したテスト用のフォルダ・ファイル

今回、テスト用のフォルダ・ファイルを用意しました。
具体的には、以下のような構造です。
treeコマンドで全体を表示.jpg

日本語の文字化けを防ぐ(-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」のオプションを使います。

$ 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 です。

$ 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」のオプションを使います。

$ tree -N -d -L 1
.
└── Macでtreeコマンド
$ tree -N -L 1
.
├── Macでtreeコマンド
└── test.txt

特定の名前のものだけ出力する(-P オプション)

次は、特定の名前のものだけをとりだす、ということをやってみます。

ファイル名で絞り込み

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

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

$ tree -N -P 'test*'
.
├── Macでtreeコマンド
│   ├── 2階層目1
│   │   └── test3.txt
│   ├── 2階層目2
│   ├── 2階層目3
│   └── test2.txt
└── test.txt

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

 tree -N -P 'test*' --prune
.
├── Macでtreeコマンド
│   ├── 2階層目1
│   │   └── test3.txt
│   └── test2.txt
└── test.txt

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

grepコマンドと組み合わせてみる

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

特定の名前のものを抽出

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

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

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

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

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

特定の名前のものの数を出力

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

$ tree -N | grep -c 2
4

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

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

特定の文字列を含まないものを抽出

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

$ tree -N | grep -v txt
.
├── Macでtreeコマンド
│   ├── 2階層目1
│   ├── 2階層目2
│   ├── 2階層目3

4 directories, 3 files

特定の文字列を含むもの/含まないものを OR条件で抽出

grepコマンドで OR条件で複数の条件指定をする場合、というのを試します。

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

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

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

特定の名前のものを抽出(正規表現を利用するバージョン)

次は、grepコマンドの条件の部分に正規表現を使ってみます。

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

$ tree -N | grep -E '[1-9]'
│   ├── 2階層目1
│   │   └── test3.txt
│   ├── 2階層目2
│   ├── 2階層目3
│   └── test2.txt
4 directories, 3 files
$ tree -N | grep -E '[1-2]'
│   ├── 2階層目1
│   ├── 2階層目2
│   ├── 2階層目3
│   └── test2.txt
$ 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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4