fzf 入門 - 履歴・ファイルをあいまい検索で爆速に
fzf とは?
結論: fzf は標準入力のリストを対話的にあいまい検索し、選んだ行を標準出力に返す UNIX フィルタ。履歴・ファイル・プロセスなど「一覧から 1 つ選ぶ」操作をすべて高速化する。
fzf(fuzzy finder)は、コマンドラインで動く汎用のあいまい検索ツールである。動作原理はシンプルで、次の 3 ステップに尽きる。
- 標準入力(stdin)から行のリストを受け取る
- 入力欄に打った文字で部分一致・あいまい一致しながら候補を絞り込む
- 確定した行を標準出力(stdout)に書き出す
この「stdin を受けて stdout に返す」という性質のおかげで、fzf はあらゆるコマンドと組み合わせられる。find | fzf、ps -ef | fzf、git log | fzf ——どんな一覧でも、その場で絞り込んで 1 行(または複数行)を選べる。
この記事で身につくこと
CTRL-R/CTRL-T/ALT-Cの 3 大キーバインドで日常操作を爆速化する- あいまい検索の拡張構文(完全一致・前方一致・否定)を使い分ける
--previewで中身を見ながら選ぶ実務レシピを書く
前提(対象環境)
- OS: Linux(Ubuntu / RHEL 系)/ macOS
- シェル: bash または zsh
- fzf バージョン: 0.48.0 以降を推奨(
fzf --bash等の統合フラグが使える)
fzf をインストールするには?
結論: ディストリのパッケージ管理(
apt/dnf/brew)が最も手軽。最新版や全機能が欲しい場合は GitHub の公式インストールスクリプトを使う。
パッケージマネージャ経由が簡単。
# Ubuntu / Debian sudo apt install fzf # Fedora / RHEL 系 sudo dnf install fzf # macOS(Homebrew) brew install fzf
ディストリ同梱版が古い場合や、キーバインド・補完を確実に入れたい場合は、公式リポジトリから直接インストールする。
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf ~/.fzf/install
インストールスクリプトは対話形式で、キーバインド・補完・シェル設定への追記を行うか尋ねてくる。基本はすべて y で問題ない。
fzf --version
0.55.0 (cabc3c0)
バージョンが 0.48.0 未満なら、後述のシェル統合は「旧方式(ファイルを source する)」が必要になる。まずは新しい版を入れるのが近道。
シェル統合で 3 つのキーバインドを有効化する
結論: シェル統合を有効化すると
CTRL-R(履歴)・CTRL-T(ファイル挿入)・ALT-C(ディレクトリ移動)が使えるようになる。fzf 0.48.0 以降は 1 行追記するだけ。
設定ファイルに次の 1 行を追記する。
# ~/.bashrc(bash) eval "$(fzf --bash)"
# ~/.zshrc(zsh) source <(fzf --zsh)
追記後、source ~/.bashrc(または新しいターミナルを開く)で反映される。これで 3 つのキーバインドが有効になる。
| キー | 動作 |
|---|---|
CTRL-R |
コマンド履歴をあいまい検索して挿入 |
CTRL-T |
カレント配下のファイル/ディレクトリを選んでコマンド行に挿入 |
ALT-C |
サブディレクトリを選んでその場で cd |
最も恩恵が大きいのは CTRL-R である。標準の CTRL-R(逐次インクリメンタル検索)と違い、うろ覚えの単語を順不同で入れても候補が一覧表示され、上下キーで選べる。
fzf 0.48.0 未満の場合
fzf --bash フラグは使えない。代わりにインストール時に生成された設定ファイルを source する(パスは環境により異なる)。
# 例: git clone 方式でインストールした場合 [ -f ~/.fzf.bash ] && source ~/.fzf.bash
なぜ fzf の検索は速いのか?あいまい検索の構文
結論: fzf は既定でスペース区切りの全単語 AND 一致+あいまい一致。記号を足せば完全一致・前方/後方一致・否定・OR も指定でき、絞り込みの精度を細かく制御できる。
入力欄では、文字を順不同・飛び飛びで打っても一致する(例: ako が awk-oneliners にヒット)。さらに記号で一致モードを切り替えられる。
| 入力例 | 意味 |
| ---------- | --------------------------------------------- | --------------------------------- |
| git push | git と push の両方を含む(AND・あいまい) |
| 'wild | wild を完全一致で含む(あいまい無効) |
| ^core | core で始まる |
| .md$ | .md で終わる |
| !test | test を含まない(否定) |
| ^src | ^app | src または app で始まる(OR) |
# 拡張子 .log で終わり、archive を含まないファイルだけ絞り込む find . -type f | fzf --query "'.log$ !archive"
--query(短縮 -q)で初期クエリを与えられる。スクリプトから「ある程度絞った状態」で起動したいときに便利。
どう実務で使うのか?(実践レシピ)
結論:
$(... | fzf)をコマンド置換に埋め込むのが基本形。vim で開く・プロセスを kill する・git ブランチを切り替える、といった「選んで実行」が 1 行で書ける。
ファイルを選んで vim で開く
vim "$(fzf)"
プロセスを選んで kill する
kill -9 "$(ps -ef | fzf | awk '{print $2}')"git ブランチを選んでチェックアウト
git checkout "$(git branch --all | fzf | tr -d ' *')"
ディレクトリを選んで移動(ALT-C を使わない場合)
cd "$(find . -type d | fzf)"
複数選択したいときは -m(--multi)を付け、TAB でマークする。選んだ全行が改行区切りで出力される。
# 複数ファイルをまとめて削除候補に rm -i $(fzf -m)
プレビューウィンドウで中身を確認しながら選ぶ
結論:
--previewに「選択中の行を引数に取るコマンド」を渡すと、右側に中身が表示される。プレースホルダ{}が現在の候補に置き換わる。
ファイル選択時に中身を覗けると、選び間違いが激減する。
# 選択中ファイルの中身を表示
fzf --preview 'cat {}'
# bat があれば色付きでプレビュー(行番号・シンタックスハイライト)
fzf --preview 'bat --color=always {}'{} が「いま選択している行」に展開される。git log と組み合わせると、コミットを選びながら差分を確認できる。
git log --oneline | fzf --preview 'git show --color=always {1}'{1} は選択行の 1 番目のフィールド(=コミットハッシュ)。プレビュー内でフィールド指定ができる。
よく使うオプションと環境変数
結論: 見た目は
--height/--layout=reverse/--borderで整える。既定の動作はFZF_DEFAULT_OPTSとFZF_DEFAULT_COMMANDに一度書いておくと全コマンドへ反映される。
よく使うオプション
--height 40%: 画面全体を占有せず、下から 40% にウィンドウを表示--layout=reverse: 入力欄を上、候補を下に表示(上から読める)--border: 枠線を付ける--multi/-m:TABで複数選択--preview 'cmd {}': プレビューウィンドウ
環境変数で既定値を固定する
# ~/.bashrc などに追記 export FZF_DEFAULT_OPTS='--height 40% --layout=reverse --border' # 候補生成コマンドを ripgrep / fd に差し替え(.gitignore 尊重・隠しファイル除外) export FZF_DEFAULT_COMMAND='fd --type f --hidden --exclude .git'
FZF_DEFAULT_COMMAND は、引数なしで fzf を起動したとき・CTRL-T のときの候補生成に使われる。fd や rg --files を指定すると .gitignore を尊重した高速な一覧になる。
FZF_DEFAULT_COMMAND に指定したコマンド(fd / rg 等)が未インストールだと、fzf 起動時に候補が空になる。エイリアスではなく実体のあるコマンド名を指定すること。
コピペ用: 最初に入れる設定
# ~/.bashrc eval "$(fzf --bash)" export FZF_DEFAULT_OPTS='--height 40% --layout=reverse --border'
これだけで CTRL-R / CTRL-T / ALT-C と、見やすい既定レイアウトが揃う。