【捜索生活向上①】ファイル検索ツール「ripgrep」を利用して、俊足かつ効率的に見つけ出す。

- 常日頃から捜索に身を捧げる技術者生活を、効率化かつ負担軽減かつ幸福化するために奮闘する記事第一弾。
- 「最先端・最新ツール」のしもべである私は、使用技術の調査に加えて、流行調査にも神経を注ぐ。
- 今回は、最近知った高速ファイル検索ツールの「ripgrep」を利用して、ローカル検索速度の向上を図ることにしよう。

## 概要
- Rust製のファイル検索CLIツール。
- 同様のファイル検索ツールの**grep**より高機能かつ高速である。
- [GitHub](https://github.com/BurntSushi/ripgrep)

## 特徴
### 高速
- ファイル検索速度は、[README](https://github.com/BurntSushi/ripgrep/blob/master/README.md)や[開発者ブログ](https://blog.burntsushi.net/ripgrep/)でのgrepとの比較でもある通り、極めて早い
- 主な高速の理由として下記。
    - 開発言語として、速度に定評があるRustを使用しているため。
    - デフォルト検索の際に、本来検索対象に入ってしまうファイル(.gitignore指定ファイルや隠しファイル・バイナリファイル等)を無視する効率的な検索プログラムのため。

### 標準的な再帰検索
- デフォルト機能で[再帰](https://wa3.i-3-i.info/word14899.html)検索が可能。
    - grepでは、デフォルト検索ではなく、「-R」のようなオプション指定で可能。

### ファイルごとの検索が簡単
- ファイル種類別(例 : JavaやRubyのみ)の検索では、定義されているファイルタイプリストを確認して、オプションに指定するだけで可能。

## インストール
- Macの場合、下記のコマンドをうち、インストール。
    - **※Homebrew未導入の場合、[こちら](https://brew.sh/index_ja)を参考に導入する。**

```bash
# ripgrepのインストール
$ brew install ripgrep
# バージョン確認
rg --version
```

- Windowsの場合、パッケージ管理ツールのchocolateyを導入して、下記のコマンドをうち、インストール。
    - **※[こちら](https://qiita.com/konta220/items/95b40b4647a737cb51aa)を参考にしてchocolateyをインストールする。**

```bash
# ripgrepのインストール
$ choco install ripgrep
# バージョン確認
rg --version
```

- その他の各種インストールは[こちら](https://github.com/BurntSushi/ripgrep/blob/master/README.md#installation)

## 作業環境
- Mac OS X 10.13.4

## 基本操作
### 作業場所での検索
- デフォルトでの検索の場合、作業場所を検索する。

```bash
# rg 検索パターン
$ cd ~/work
$ rg hoge
```

### 指定ファイル名やフォルダ名での検索
- 任意の指定したフォルダ等で検索する場合。

```bash
# 「rg 検索パターン ファイル名」
$ rg hoge index.html
# 「rg 検索パターン フォルダ名」
$ rg hoge ~/work
```

### 正規表現での検索
- 正規表現を用いて検索する場合。

```bash
# 「rg 正規表現パターン 検索場所」
$ rg '090\d+' ~/work
$ rg 'H.*' ~/work
```

### キーワード検索
- 正規表現を無効にして、文字列として検索する場合。

```bash
# rg -F '検索文字列'
$ rg -F 'if(' ~/work/index.js
```

### 対象外ファイル検索
- デフォルトでは検索の対象外となっている下記のファイルを検索する場合
    - **.ignore系に定義されたファイル**
    - **.ssh等の隠しファイル**
    - **バイナリファイル**
    - **シンボリックリンク**

```bash
# ignore系に定義されたファイル等の検索
$ rg --no--ignore 検索パターン 定義ファイル
# 隠しファイルの検索
$ rg --hidden 検索パターン 隠しファイル名
# バイナリファイル
$ rg --text 検索パターン バイナリファイル名
$ rg -a 検索パターン バイナリファイル名      # こちらでも可能。
# シンボリックリンク
$ rg --follow 検索パターン シンボリックリンク
$ rg -L 検索パターン シンボリックリンク
```

### ファイル種類毎検索
- 特定のファイル種類(例:Rubyファイルのみ)で検索する場合。
- ファイル種類(ファイルタイプ)は下記のコマンドで確認できる。

```bash
# 全ファイルタイプ確認
$ rg --type--list
# 指定ファイルタイプ確認
$ rg --type--list | rg 'ruby'
# 複数指定ファイルタイプ確認
$ rg --type--list | rg 'ruby|js'
```

- 実際にファイルタイプで検索する場合は下記。

```bash
# 「rg 検索パターン -tファイルタイプ」
$ rg 'def' -trb
```

- 指定ファイルタイプを除いた検索は下記。

```bash
# rg 検索パターン -T除外ファイルタイプ
$ rg 'def' -Tpy
```

### 置換
- 検索一致文字列を別の文字列へ置換する場合。

```bash
# rg 検索文字 検索場所 -r 置換文字
$ rg hoge ~/work -r fuga
```

### 大小文字の区別無し検索
- 大文字と小文字の区別を無視して、検索する場合。
- デフォルトの状態では、区別して検索している。

```bash
# 「rg -i 検索パターン 検索場所」
$ rg -i hoge ~/work
```

## 設定ファイルの作成
- ripgrepの設定ファイルを作成することで、独自のオプションを追加できる。

```bash
# 設定ファイルの作成
$ touch ~/.ripgreprc
# 設定ファイルにパスを設定
$ export RIPGREP_CONFIG_PATH="$HOME/.ripgreprc"
```

- 設定ファイルの基本的な書き方は、下記。
    - **#のあとは、コメントになる。**
    - **設定できるオプション等は[こちら](https://github.com/BurntSushi/ripgrep/blob/master/GUIDE.md#configuration-file)で確認。**

```rc:.ripgreprc
# 色設定
--colors=style:bold

# ファイルタイプ追加定義
# こうすることで、「rg -tweb ~~」で追加したファイル群で検索できる。
--type-add
web:*.{html,css,js}*
```

## まとめ
- 今回はファイル検索ツールの利用ということで、すっかり主目的を忘れ、ゲーム感覚でコマンドを乱発しながら記事を書く。
- 驚愕の速度と高機能さを更に引き出すため、「細かなエイリアスの登録」や「正規表現の習得」を図る。
- 「次もローカル検索か、それともWeb上の検索か」と、どちらにせよ最新ツールを利用する未来が決定している状態に、意気揚々にほてる。

## 参考
- https://github.com/BurntSushi/ripgrep  
→公式GitHubを参考にいたしました。大変お世話になりました。
- https://www.excellence-blog.com/2019/05/10/%E6%96%B0%E4%B8%96%E4%BB%A3grep-ripgrep/  
→こちらの記事を参考にしました。大変お世話になりました。