Ubuntu Weekly Recipe

第504回 インタラクティブフィルター「fzf」の活用

この記事を読むのに必要な時間:およそ 5 分

Fuzzy Finder略してfzfとは,コマンドライン上で動作するインタラクティブなフィルターツールです。標準入力から受け取ったリストからユーザーが対話的に選択を行い,その結果を標準出力に出力する,一言で言えばpecoによく似たツールです。

今回はUbuntu上でfzfを便利に使うレシピを紹介します。

fzfのインストール

Ubuntuにはfzfのパッケージはまだないため,gitのリポジトリからインストールします。ホームディレクトリ直下の「.fzf」ディレクトリにfzfのリポジトリをcloneしてください。リポジトリ内にあるインストール用のシェルスクリプトを実行します。

fzfのcloneクローン

$ git clone https://github.com/junegunn/fzf.git ~/.fzf

インストールスクリプトの実行例。~/.fzf.bashが生成され,.bashrcが変更されている

$ ~/.fzf/install
Downloading bin/fzf ...
Do you want to enable fuzzy auto-completion? ([y]/n) y
Do you want to enable key bindings? ([y]/n) y 

Generate ~/.fzf.bash ... OK

Do you want to update your shell configuration files? ([y]/n) y

Update /home/mizuno/.bashrc:
  - [ -f ~/.fzf.bash ] && source ~/.fzf.bash
    + Added

Finished. Restart your shell or reload config file.
   source ~/.bashrc  # bash

Use uninstall script to remove fzf.

For more information, see: https://github.com/junegunn/fzf

インストールスクリプトは,

  • fzfの実行バイナリのダウンロード
  • fzf設定ファイル(~/.fzf.bash)の作成※1
※1
fzfはzshとfishにも対応しており,zshがインストールされている環境ではzsh用のファイルも生成されます。本記事ではbashのみがインストールされているシステムを前提に解説します。

を行っています。設定ファイルの中ではダウンロードしたバイナリへのPATHの設定の他,対話的な選択肢に応じてさらに以下に述べる設定が行われます。

「Do you want to enable fuzzy auto-completion?」は,fzfコマンド用のauto-completionを読み込むかどうかです。通常は「y」で構わないでしょう。⁠y」と回答すると,~/.fzf.bashの中で「~/.fzf/shell/completion.bash」が読み込まれます。

「Do you want to enable key bindings?」は,fzfを利用した便利な機能を特定のキーにバインドし,シェルの機能を拡張するかどうかです。ただしシェルの標準の機能(たとえばCtrl+rで履歴の検索)をfzfで置き換えてしまうため,使い慣れた設定を書き換えられるのが嫌な場合は「n」を選択してもよいでしょう※2)⁠⁠y」と回答すると,.fzf.bashの中で「~/.fzf/shell/key-bindings.bash」が読み込まれます。

※2
本記事では「y」を選択したことを前提に機能を解説します。

これらの2項目は「n」を選択しても,~/.fzf.bashの中にコメントアウトされた状態で設定が記述されるので,コメントを解除するだけで後からも有効にできます。

「Do you want to update your shell configuration files?」は,シェルの起動時に.fzf.bashを読み込むかどうかです。具体的には「y」を選択すると,~/.bashrcの最後に以下の一行が追記されます。

~/.bashrcから~/.fzf.bashを読み込む設定

[ -f ~/.fzf.bash ] && source ~/.fzf.bash

インストールが完了したら,手動で~/.fzf.bashを読み込むか,シェルを再起動してください。

fzfのアンインストール

~/.fzf/uninstallを実行すると,installスクリプトが生成した設定ファイルと,シェルの設定ファイルに追記した読み込み設定が削除されます。あとはcloneした~/.fzfディレクトリを削除すれば,インストールの前の状態に戻れます。

fzfのアンインストール

$ ~/.fzf/uninstall
$ rm -rf ~/.fzf

fzfの基本的な使い方

それでは実際にfzfを使っていきましょう。fzfの主なキー操作は表の通りです。

キー操作 挙動
↑ or CTRL+p or CTRL+k カーソルを上に移動する
↓ or CTRL+n or CTRL+j カーソルを下に移動する
ENTER カーソル位置にある項目,あるいはマークした項目を選択する
TAB or SHIFT+TAB カーソル位置にある項目にマークをつける(マルチセレクトモード時のみ)
ESC or CTRL+c or CTRL+g fzfを終了する

前述の通り,fzfは標準入力からリストを受け取り,それをフィルタするのが基本です。たとえば以下はfindコマンドでカレントディレクトリ以下にあるディレクトリのリストを出力し,それをfzfでフィルタする例です。

カレントディレクトリにあるディレクトリの一覧を対話的に選択する例

$ find . -maxdepth 1 -type d | fzf

fzf上で検索ワードを入力すると,リストから候補を絞り込めます。リストの項目が多い場合は,全体を目視できる程度まで検索で絞り込み,最後にカーソルを使って候補を選択するのが基本です。

図1 findコマンドの出力をfzfに渡した状態。ここから検索ワードを入力して絞り込んだり,カーソルで項目を選択する

画像

図2 ⁠mai」と入力してみたところ。Mailディレクトリはもちろんのこと,あいまい検索によりこれらのアルファベットを含む「.thumbnails」ディレクトリも候補にあげられた

画像

図3 絞り込んだリストから「Mail」を選択してEnterを押したところ。標準出力に選択した項目が表示された

画像

これだけでは選択したディレクトリ名が標準出力に表示されるだけなので,何の役にも立ちませんよね。そこでフィルタした結果をコマンドに埋め込んだり,パイプで他のコマンドに渡してみましょう。

たとえば上記のフィルタ結果をduコマンドの引数に埋め込んでみましょう。これで,対話的に選択したディレクトリの容量をチェックするワンライナーになります。

選択したディレクトリをduコマンドに渡し,容量を計算する例

$ du -hs $(find . -maxdepth 1 -type d | fzf)
117M    ./Mail

「-m」オプションをつけると,fzfはマルチセレクトモードになります。このモードでは,複数の項目にTABキーでマークをつけられます。マークがついた状態でENTERキーを押すと,マークした(複数の)項目が標準出力に渡されます。なおマークをひとつもつけずにENTERキーを押すと,シングルセレクトモードと同等の挙動となります※3)⁠

※3
ひとつ以上の項目にマークをつけた状態で,マークのついていない項目の上にカーソルを動かしてENTERを押した場合,その(カーソルの下にあるマークのついていない)項目は選択されません。当然の挙動だとは思いますが,念の為。

前述の例をマルチセレクトモードで動かしてみましょう。選択した複数のディレクトリの容量をチェックできるようになりました。

複数のディレクトリを選択し,それぞれの容量を計算する例

$ du -hs $(find . -maxdepth 1 -type d | fzf -m)
4.2G    ./ownCloud
13G ./Downloads
30M ./Desktop
117M    ./Mail

なおパイプを繋がずにfzfを単独で起動すると,内部でfindコマンドを使ってカレントディレクトリ以下のファイルのリスト※4を読み込みます。

※4
find * -type fの結果が読み込まれます。ドットではじまる隠しファイルや,ディレクトリそのものはリストアップされません。

fzfを単体で起動した際に呼ばれるコマンドは,環境変数「FZF_DEFAULT_COMMAND」で変更できます。たとえば以下のように環境変数を設定しておくと,findコマンドのかわりにpsコマンドが実行され,プロセスの一覧が候補リストとして渡されます。

パイプを繋がずにfzfを起動した際の挙動を変更する

$ export FZF_DEFAULT_COMMAND='ps aux'
$ fzf

著者プロフィール

水野源(みずのはじめ)

Ubuntu Japanese Teamメンバー。理想のフリーデスクトップ環境を求めて東へ西へ……のはずが,気がついたら北の大地で就職していたインフラ寄りのエンジニア。株式会社インフィニットループ所属。

コメント

コメントの記入