Skip to content

FZF 模糊搜索工具完全教程#

FZF (Fuzzy Finder) 是一个通用的命令行模糊搜索工具,可以大幅提升命令行操作效率。

目录#

安装配置#

Ubuntu/Debian#

sudo apt install fzf

macOS#

brew install fzf
# 安装 shell 集成
$(brew --prefix)/opt/fzf/install

从源码安装#

git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install

验证安装#

fzf --version

基础用法#

1. 文件搜索#

# 在当前目录搜索文件
fzf

# 搜索并直接编辑选中的文件
vim $(fzf)

# 搜索特定类型文件
find . -name "*.py" | fzf

2. 历史命令搜索#

# Ctrl+R 搜索历史命令(需要 shell 集成)
history | fzf

3. 进程搜索#

# 搜索并终止进程
ps aux | fzf | awk '{print $2}' | xargs kill

快捷键操作#

基础快捷键#

快捷键 功能
Ctrl+J/K↓/↑ 上下移动
Enter 选择当前项
Esc 退出
Tab 多选模式标记/取消标记
Shift+Tab 反向多选

搜索快捷键#

快捷键 功能
Ctrl+A 全选
Ctrl+D 取消全选
Ctrl+T 切换全选状态
Alt+A 选择所有匹配项
Alt+D 取消选择所有项

预览快捷键#

快捷键 功能
? 切换预览窗口
Ctrl+U/D 预览窗口上下滚动

高级功能#

1. 预览模式#

# 预览文件内容
fzf --preview 'cat {}'

# 预览目录结构
fzf --preview 'ls -la {}'

# 动态预览窗口大小
fzf --preview 'cat {}' --preview-window=right:70%:wrap

2. 多选模式#

# 启用多选
fzf -m

# 多选文件并复制
cp $(fzf -m) /target/directory/

3. 自定义搜索命令#

# 使用 fd 替代 find
export FZF_DEFAULT_COMMAND='fd --type f --hidden --follow --exclude .git'

# 使用 rg 搜索文件内容
export FZF_DEFAULT_COMMAND='rg --files --hidden --follow --glob "!.git/*"'

4. 交互式过滤#

# 实时过滤日志
tail -f /var/log/system.log | fzf --no-sort --tac

Shell 集成#

Bash/Zsh 快捷键#

安装 shell 集成后可用:

快捷键 功能
Ctrl+T 搜索文件并插入路径
Ctrl+R 搜索历史命令
Alt+C 搜索目录并跳转

配置示例#

# ~/.bashrc 或 ~/.zshrc
export FZF_DEFAULT_OPTS='
  --height 40% 
  --layout=reverse 
  --border
  --preview "cat {}"
  --preview-window=right:60%:wrap'

# 自定义 Ctrl+T 行为
export FZF_CTRL_T_OPTS="
  --preview 'bat --color=always --line-range :500 {}'
  --bind shift-up:preview-page-up,shift-down:preview-page-down"

实用案例#

1. 快速文件编辑#

# 创建快捷函数
vf() {
  local file
  file=$(fzf --preview 'bat --color=always --line-range :500 {}') && vim "$file"
}

2. Git 分支切换#

# 交互式分支切换
fbr() {
  local branches branch
  branches=$(git branch -vv) &&
  branch=$(echo "$branches" | fzf +m) &&
  git checkout $(echo "$branch" | awk '{print $1}' | sed "s/.* //")
}

3. 进程管理#

# 交互式进程终止
fkill() {
  local pid
  pid=$(ps -ef | sed 1d | fzf -m | awk '{print $2}')
  if [ "x$pid" != "x" ]; then
    echo $pid | xargs kill -${1:-9}
  fi
}

4. 目录跳转#

# 快速目录跳转
fd() {
  local dir
  dir=$(find ${1:-.} -path '*/\.*' -prune -o -type d -print 2> /dev/null | fzf +m) &&
  cd "$dir"
}

5. Docker 容器管理#

# 进入 Docker 容器
dexec() {
  local cid
  cid=$(docker ps | sed 1d | fzf -q "$1" | awk '{print $1}')
  [ -n "$cid" ] && docker exec -it "$cid" bash
}

6. 环境变量查看#

# 搜索环境变量
fenv() {
  env | fzf --preview 'echo {} | cut -d= -f2-'
}

自定义配置#

1. 颜色主题#

export FZF_DEFAULT_OPTS='
  --color=fg:#f8f8f2,bg:#282a36,hl:#bd93f9
  --color=fg+:#f8f8f2,bg+:#44475a,hl+:#bd93f9
  --color=info:#ffb86c,prompt:#50fa7b,pointer:#ff79c6
  --color=marker:#ff79c6,spinner:#ffb86c,header:#6272a4'

2. 布局设置#

export FZF_DEFAULT_OPTS='
  --height 60%
  --layout=reverse
  --border=rounded
  --margin=1
  --padding=1'

3. 预览设置#

export FZF_DEFAULT_OPTS='
  --preview-window=right:50%:hidden:wrap
  --bind=ctrl-/:toggle-preview
  --bind=ctrl-u:preview-page-up
  --bind=ctrl-d:preview-page-down'

4. 自定义绑定#

export FZF_DEFAULT_OPTS='
  --bind=ctrl-a:select-all
  --bind=ctrl-d:deselect-all
  --bind=ctrl-t:toggle-all
  --bind=alt-j:jump
  --bind=alt-k:jump-accept'

高级技巧#

1. 与其他工具结合#

与 ripgrep 结合#

# 搜索文件内容
rg --line-number --no-heading --color=never "search_term" | 
fzf --delimiter : --preview 'bat --color=always --line-range {2}: {1}'

与 fd 结合#

# 快速查找文件
alias ff='fd --type f | fzf --preview "bat --color=always --line-range :500 {}"'

2. 复杂搜索模式#

# 精确匹配
fzf --exact

# 反向搜索
fzf --query="!pattern"

# 多条件搜索
fzf --query="term1 term2"

3. 自定义启动脚本#

# ~/.fzf_functions.sh
#!/bin/bash

# 搜索并编辑配置文件
fedit() {
  local files
  files=$(find ~/.config -name "*.conf" -o -name "*.cfg" -o -name "*.ini" | fzf -m)
  [[ -n "$files" ]] && ${EDITOR:-vim} $files
}

# 搜索并安装包
finstall() {
  apt list 2>/dev/null | grep -v "WARNING" | 
  fzf --multi --preview 'apt show {1}' | 
  cut -d'/' -f1 | 
  xargs -ro sudo apt install
}

性能优化#

1. 缓存搜索结果#

# 使用缓存加速大目录搜索
export FZF_DEFAULT_COMMAND='fd --type f --hidden --follow --exclude .git 2>/dev/null'

2. 限制搜索深度#

# 限制搜索深度提升性能
fd --max-depth 3 --type f | fzf

3. 异步预览#

# 异步预览大文件
fzf --preview 'timeout 1 bat --color=always --line-range :100 {}'

故障排除#

1. 中文显示问题#

export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8

2. 预览不工作#

# 检查依赖工具
which bat || sudo apt install bat
which fd || sudo apt install fd-find

3. 快捷键冲突#

# 检查按键绑定
bind -p | grep fzf

故障排除:关于管道输入与预置查询#

如果遇到像下面这样的错误:

rg --line-number --no-heading '' | fzf "termux"
# 输出:unknown option: termux

说明与修正要点:
- 当把其它命令的输出通过管道传给 fzf 时,若想预先设置查询词(initial query),应使用 -q 或 --query 参数;直接把查询词作为位置参数可能被误解析或在某些组合中产生错误。
- 推荐使用方式示例:

正确示例:

# 使用 -q 指定初始查询(大小写敏感)
rg --line-number --no-heading '' | fzf -q termux

# 使用 --query 指定初始查询(等价)
rg --line-number --no-heading '' | fzf --query=termux

# 忽略大小写
rg --line-number --no-heading '' | fzf -i -q termux

# 带预览的示例(结合 bat)
rg --line-number --no-heading '' | fzf -q termux --preview 'bat --color=always --style=numbers {1}'

简短说明:
- -q / --query 用于设置初始过滤关键词;也可以在 fzf 启动后直接输入搜索词。
- 若仍报奇怪的 option 错误,检查 fzf 版本(fzf --version)并确保没有把查询词误写成以 - 开头的字符串或放在不恰当的位置。

总结#

FZF 是一个强大的模糊搜索工具,通过合理配置可以大幅提升命令行工作效率。主要优势:

  • 🚀 快速模糊搜索
  • 🎨 丰富的自定义选项
  • 🔧 与各种工具无缝集成
  • ⚡ 高性能和低内存占用
  • 🎯 直观的交互体

建议从基础用法开始,逐步添加自定义配置和函数,根据个人工作流程定制最适合的使用方式。


Last update: 2025-09-10
Created: 2025-09-03