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 需要支持该接口的版本,旧版按安装包提供的集成脚本启用。
参考与延伸
根据技术笔记重新整理,示例使用通用名称。