32blogby StudioMitsu

fzf完全ガイド:あいまい検索でターミナル操作を革命する

fzfの導入からシェル統合・Git連携・カスタマイズまで。Ctrl+RやCtrl+Tを強化して作業効率を劇的に上げる方法を解説。

13 min read
目次

「あのファイルどこだっけ」「3日前に打ったコマンドが思い出せない」「Gitのブランチが多すぎて探せない」

ターミナル作業で地味にストレスになるのが「探す」行為だ。history | grepfind . -name で頑張るのも限界がある。

ここで登場するのが fzf だ。あいまい検索でファイル・コマンド履歴・Gitブランチ・プロセス……何でもインタラクティブに絞り込める。一度使うと Ctrl+R なしの生活には戻れなくなる。

fzf とは

fzf は Go 製のインタラクティブあいまい検索ツールだ。作者は vim-plug や fzf.vim でも知られる junegunn 氏。

UNIX哲学に忠実で、stdin からデータを受け取り、ユーザーが選択した行を stdout に返す というシンプルな設計になっている。この「何でも受け取って何でも返す」思想が、fzf をあらゆる場面で使える万能ツールにしている。

主な特徴:

  • あいまい検索(fuzzy matching):完全一致しなくても、部分的なキーワードで候補を絞り込める
  • 超高速:v0.70.0 でフィルタリング性能が 1.3〜1.9 倍に向上。数万ファイルでも一瞬
  • シェル統合Ctrl+R(履歴検索)・Ctrl+T(ファイル挿入)・Alt+C(ディレクトリ移動)を強化
  • プレビュー機能:選択前にファイル内容やGit差分をリアルタイムプレビューできる
  • パイプで何にでも繋がるfindgitpsdocker ……どんなコマンドの出力もフィルタリング対象にできる

インストールと初期設定

WSL を使っている場合は Linux と同じ手順でインストールできる。

PowerShell で直接使う場合:

powershell
winget install junegunn.fzf

シェルへの統合設定

fzf 0.48 以降はシェル統合が大幅に簡素化された。以下を設定ファイルに追記する。

bash の場合(~/.bashrc):

bash
eval "$(fzf --bash)"

zsh の場合(~/.zshrc):

bash
source <(fzf --zsh)

設定を反映する:

bash
source ~/.bashrc  # bash の場合
source ~/.zshrc   # zsh の場合

基本的な使い方

ファイルをあいまい検索する

引数なしで fzf を実行すると、カレントディレクトリ以下のファイルをすべてリストアップし、インタラクティブに絞り込める。

bash
fzf

入力した文字列がどこかに含まれている ファイルが候補として残る。完全一致でなくても大丈夫だ。たとえば cnf と打てば configconf.yamlnginx.conf などがヒットする。

パイプで入力を渡す

fzf の真価はパイプとの組み合わせにある。

bash
# JavaScript ファイルだけを対象にする
find . -name "*.js" | fzf

# 環境変数から検索する
env | fzf

# 最近使ったコマンドから検索する
history | fzf

複数選択する

-m--multi)オプションで Tab キーによる複数選択が可能になる。

bash
# 複数ファイルを選択して削除
rm $(fzf -m)

プレビュー付きで選択する

--preview オプションでファイル内容を横に表示できる。bat がインストール済みならシンタックスハイライト付きのプレビューになる。

bash
# cat でプレビュー
fzf --preview 'cat {}'

# bat でシンタックスハイライト付きプレビュー
fzf --preview 'bat --color=always {}'

初期クエリを指定する

最初から検索文字列を入れた状態で起動したい場合は -q オプションを使う。

bash
fzf -q "test"

選択結果をコマンドに渡す

$(fzf) でコマンド置換すれば、選択したファイルをそのまま別のコマンドに渡せる。

bash
# 選択したファイルを vim で開く
vim $(fzf)

# 選択したファイルを VS Code で開く
code $(fzf)

シェル統合

fzf の最大の魅力はシェル統合だ。3つのキーバインドを覚えるだけで、ターミナル操作が一変する。

Ctrl+R — コマンド履歴のあいまい検索

シェル標準の Ctrl+R(reverse-i-search)を fzf が置き換える。

  • 標準の Ctrl+R:1件ずつ逆順に辿るしかない
  • fzf の Ctrl+R全履歴をあいまい検索 して一発で見つかる
bash
# 使い方:コマンドラインで Ctrl+R を押す
# → fzf のインタラクティブ画面が開く
# → キーワードを入力して候補を絞り込む
# → Enter で選択したコマンドがコマンドラインに挿入される

3日前に打った docker-compose のコマンドも、dock と打つだけで見つかる。

Ctrl+T — ファイルパスをコマンドラインに挿入

コマンドを途中まで打った状態で Ctrl+T を押すと、fzf でファイルを検索してパスを挿入できる。

bash
# 使い方:
# vim と打ってから Ctrl+T を押す
# → fzf でファイルを選択
# → vim path/to/selected/file がコマンドラインに入る

Tab でファイル名補完するよりも圧倒的に速い。特に深いディレクトリにあるファイルを開くときに威力を発揮する。

Alt+C — ディレクトリ移動

Alt+C を押すとディレクトリをあいまい検索して cd できる。

bash
# 使い方:Alt+C を押す
# → ディレクトリ一覧が fzf で表示される
# → 選択すると cd が実行される

cd + Tab 連打で階層を掘っていく作業から解放される。

デフォルトコマンドのカスタマイズ

fzf のファイルリストを生成するコマンドは環境変数で変更できる。fd(Rust 製の高速 find 代替)を使うと、.gitignore を自動的に尊重して高速にリスト化できる。

bash
# fd がインストール済みの場合(.bashrc / .zshrc に追記)
export FZF_DEFAULT_COMMAND='fd --type f --hidden --follow --exclude .git'
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"
export FZF_ALT_C_COMMAND='fd --type d --hidden --follow --exclude .git'

fd の詳しい使い方は Rust 製 CLI ツール完全ガイド を参照してほしい。

実践ユースケース

fzf の本領は「他のコマンドと組み合わせる」ところにある。ここでは実際に業務で使えるパターンを紹介する。

Git 操作の高速化

Git はブランチやコミットが増えるほど操作が面倒になる。fzf で一気に解決できる。

bash
# ブランチをあいまい検索して切り替え
git checkout $(git branch --all | fzf)

# コミットをあいまい検索(プレビューで差分表示)
git log --oneline | fzf --preview 'git show {+1}'

# 変更ファイルをあいまい検索(プレビューで差分表示)
git diff --name-only | fzf --preview 'git diff {}'

プロセスの検索と kill

暴走プロセスを探して止めるのも、fzf なら一発だ。

bash
# プロセスを検索して kill
kill $(ps aux | fzf | awk '{print $2}')

# シグナル指定で kill
kill -9 $(ps aux | fzf | awk '{print $2}')

ripgrep + fzf でコード検索

ripgrep の検索結果を fzf で絞り込み、選択した箇所をプレビューする。コードベース内の TODO やエラー箇所を探すのに最適だ。

bash
# TODO コメントを検索してプレビュー
rg --line-number "TODO" | fzf --delimiter ':' --preview 'bat --color=always --highlight-line {2} {1}'

Docker コンテナ操作

稼働中のコンテナを選択してシェルに入る。

bash
# コンテナを選択して bash に入る
docker exec -it $(docker ps --format '{{.Names}}' | fzf) bash

# コンテナのログを表示
docker logs --tail 100 $(docker ps --format '{{.Names}}' | fzf)

SSH 接続先の選択

~/.ssh/config に登録済みのホストから選んで接続する。

bash
# SSH 接続先をあいまい検索
ssh $(grep "^Host " ~/.ssh/config | awk '{print $2}' | fzf)

カスタマイズ

デフォルトオプションの設定

FZF_DEFAULT_OPTS 環境変数で fzf の見た目と挙動を変更できる。

bash
# .bashrc / .zshrc に追記
export FZF_DEFAULT_OPTS='
  --height 40%
  --layout=reverse
  --border
  --info=inline
  --margin=1
  --padding=1
'
  • --height 40%:画面の 40% だけ使う(フルスクリーンにしない)
  • --layout=reverse:候補を上から表示(デフォルトは下から)
  • --border:枠線を表示
  • --info=inline:マッチ数をプロンプト行に表示

カラースキームの設定

--color オプションで色をカスタマイズできる。

bash
export FZF_DEFAULT_OPTS='
  --height 40%
  --layout=reverse
  --border
  --color=fg:#c0caf5,bg:#1a1b26,hl:#bb9af7
  --color=fg+:#c0caf5,bg+:#292e42,hl+:#7dcfff
  --color=info:#7aa2f7,prompt:#7dcfff,pointer:#ff007c
  --color=marker:#9ece6a,spinner:#9ece6a,header:#9ece6a
'

キーバインドのカスタマイズ

--bind オプションで fzf 内のキーバインドを変更できる。

bash
export FZF_DEFAULT_OPTS='
  --height 40%
  --layout=reverse
  --border
  --bind "ctrl-y:execute-silent(echo {} | xclip -selection clipboard)"
  --bind "ctrl-e:execute(vim {})"
'
  • ctrl-y:選択中の項目をクリップボードにコピー
  • ctrl-e:選択中のファイルを vim で開く

シェル関数で使いやすくする

よく使うパターンはシェル関数にまとめておくと便利だ。以下を ~/.bashrc または ~/.zshrc に追記する。

bash
# fzf でファイルを選んで vim で開く
fv() {
  local file
  file=$(fzf --preview 'bat --color=always {}' --height 80%)
  [ -n "$file" ] && vim "$file"
}

# fzf で Git ブランチを切り替える
fb() {
  local branch
  branch=$(git branch --all | fzf --height 40% | sed 's/^[* ]*//' | sed 's|remotes/origin/||')
  [ -n "$branch" ] && git checkout "$branch"
}

# fzf でディレクトリを選んで cd する(プレビューで中身表示)
fd_cd() {
  local dir
  dir=$(find . -type d 2>/dev/null | fzf --preview 'ls -la {}' --height 60%)
  [ -n "$dir" ] && cd "$dir"
}

まとめ

fzf は「あいまい検索」というシンプルな機能を、UNIX パイプの思想で極限まで汎用化したツールだ。

最初にやるべきことは3つだけ:

  1. インストールしてシェル統合を有効にするeval "$(fzf --bash)" を .bashrc に追記)
  2. Ctrl+R / Ctrl+T / Alt+C を使い始める(これだけで作業効率が上がる)
  3. fd と bat を入れてデフォルトコマンドを差し替える(検索が速く、プレビューが見やすくなる)

この3ステップで fzf の恩恵の大部分を受け取れる。慣れてきたら Git 連携やシェル関数を追加して、自分だけのワークフローを作っていこう。

関連記事: