OFFSET偏移
← 文章目录OFFSET / FIELD NOTESNO. 043

模糊搜索:fzf

把文件、进程、分支和历史列表变成可交互选择的输入。

所在专题Linux 命令行基础与组合 ↗
约 5 分钟阅读开始阅读

1. 是什么#

fzf(fuzzy finder)是一个通用的命令行模糊搜索工具。工作模型很简单:从 stdin 读取列表 → 交互式筛选 → 选中结果输出到 stdout。

ls | fzf        # 从文件列表中选一个

和 Ctrl+R(历史搜索)相比,fzf 是通用的:文件列表、进程列表、git branch、任何文本列表都能搜。

2. 基本用法#

# 模糊搜文件然后用 vim 打开
IFS= read -r -d '' selected < <(find . -type f -print0 | fzf --read0 --print0) && nvim -- "$selected"

# 搜进程并 kill
ps -eo pid=,comm=,args= | fzf | awk '{print $1}' | xargs -r -p kill

# 从命令历史中选一条,先显示核对,再手动执行
history | fzf | awk '{$1=""; print $0}'

3. 常用组合#

# 快速 cd(配合 zoxide)
selected=$(zoxide query --list | fzf) && [ -n "$selected" ] && cd -- "$selected"

# 搜 git branch 并切换
git for-each-ref --format='%(refname:short)' refs/heads | fzf | xargs -r git switch

# 搜 commit 并 cherry-pick
git log --oneline | fzf | awk '{print $1}' | xargs -r -p git cherry-pick

# 搜文件内容并打开
rg -l -0 "" | fzf --read0 --print0 | xargs -0 -r -o nvim --

4. 快捷键#

按键 作用
Ctrl+n / Ctrl+p 上下移动
Ctrl+j / Ctrl+k 上下移动(vi 风格)
Enter 确认选中
Esc / Ctrl+c 取消
Ctrl+a / Ctrl+e 跳到行首 / 行尾
Tab 多选标记

5. 常用选项#

fzf --multi                     # Tab 多选
fzf --preview 'cat -- {}'          # 右侧预览文件内容
fzf --preview 'bat --color=always -- {}'    # 语法高亮预览
fzf --preview 'ls -la -- {}'       # 预览目录内容
fzf --height 40%                # 占终端 40% 高度,不占全屏
fzf --layout=reverse            # 搜索框在顶部

6. 进阶绑定(shell 集成)#

安装 fzf 后,建议启用 shell 集成来替换默认的 Ctrl+R 和 Ctrl+T:

# bash/zsh: 在 .bashrc 或 .zshrc 中添加
eval "$(fzf --bash)"   # 或 --zsh

# fish: fzf 自带 fish 集成,或在 config.fish 中
fzf --fish | source

启用后你会获得:

  • Ctrl+R — 模糊搜索命令历史(替换原生的)
  • Ctrl+T — 模糊搜索当前目录文件并粘贴路径
  • Alt+C — 模糊搜索目录并 cd 过去

日常场景速查#

我想... 命令
快速打开某个文件 使用上文的 NUL 分隔与 read 示例
切到某个 git 分支 git for-each-ref --format='%(refname:short)' refs/heads | fzf | xargs -r git switch
杀死某个进程 ps -eo pid=,comm=,args= | fzf | awk '{print $1}' | xargs -r -p kill
搜命令历史 Ctrl+R(启用 fzf shell 集成后)
选文件预览内容 fzf --preview 'bat {}'


以上赋值、read -d 与进程替换示例使用 Bash。-r、-o、-p 是这里使用的 GNU xargs 选项。终止进程和 cherry-pick 会改变状态,先检查所选 PID 或提交及工作区。fzf 只是选择器,仍需检查上游列表和下游操作;普通换行列表不适合包含换行的文件名。fzf --bash/--zsh/--fish 需要支持该接口的版本,旧版按安装包提供的集成脚本启用。

参考与延伸

  1. fzf 官方说明 ↗
  2. GNU xargs 选项 ↗

根据技术笔记重新整理,示例使用通用名称。

沿专题继续阅读

Linux 命令行基础与组合

  1. 01文件与目录操作
  2. 02进程与作业管理
  3. 03文本处理与系统查询
  4. 04Shell 基本功
  5. 05模糊搜索:fzf
  6. 06参数传递:xargs
CONTINUE READING / 下一篇参数传递:xargs

将标准输入转成命令参数,并处理定界、占位符、并发与空输入。