[Tool] [搜索] fzf: 模糊搜索神器

01 背景

1.1 简介

fzf是一款命令行模糊查找工具,能让你在终端里快速筛选和定位文件、命令历史、进程甚至任何文本数据,就像为你的命令行装上了即时搜索的“快捷键”。

1.2 官网

fzf的Github地址为:GitHub: junegunn/fzf

02 安装

# Debian/Ubuntu
sudo apt install fzf

# Red Hat/CentOS
sudo dnf install fzf

# macOS
brew install fzf

# 通用方法:从源码安装
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install

03 使用

3.0 默认

fzf 默认操作就是递归搜索当前目录下的文件和文件夹

fzf

3.1 管道

任何能输出列表的命令都可以通过管道传递给 fzf 进行交互式过滤

find . -type f | fzf
history | fzf
ps aux | fzf

3.2 命令替换

vim $(fzf)              		# 快速打开文件
cd $(find . -type d | fzf) 		# 快速切换目录

3.3 交互式界面

快捷键 功能
Enter 确认选择
Ctrl-C / Esc 退出
Ctrl-J / Ctrl-K 上下移动光标
Ctrl-N / Ctrl-P 上下移动光标
鼠标点击 / 滚轮 选择和滚动

3.4 shell快捷键

这些是fzf可以实现的快捷键绑定功能:

快捷键 功能描述
Ctrl + T 搜索当前目录及子目录的文件和文件夹,并将选中项路径插入命令行。
Ctrl + R 模糊搜索命令历史记录,并将选中命令插入命令行。
Alt + C 快速切换目录。列出当前目录下的所有文件夹,选择后直接跳转。

如果以上功能无法使用,可以执行以下脚本实现快捷键绑定:

# 自动添加 fzf 配置到 ~/.bashrc
echo '' >> ~/.bashrc
echo '# 自动设置 fzf 的快捷键和模糊补全' >> ~/.bashrc
echo 'if command -v fzf &> /dev/null; then' >> ~/.bashrc
echo '    eval "$(fzf --bash)"' >> ~/.bashrc
echo 'fi' >> ~/.bashrc

# 重新加载配置
source ~/.bashrc

3.5 搜索语法

3.5.1 模糊匹配

# 匹配包含 s,b,t,r,k,t 且顺序一致的项目
echo -e "subtracket\nsubtract\nproject" | fzf -q "sbtrkt"

3.5.2 前缀精确匹配

# 匹配以 music 开头的行
echo -e "music.mp3\nmusic_playlist.txt\nbackground_music.aac" | fzf -q "^music"

3.5.3 后缀精确匹配

# 后缀精确匹配:匹配以 .mp3 结尾的行
echo -e "song.mp3\npodcast.mp3\nimage.jpg" | fzf -q ".mp3$"

3.5.4 精确匹配 (引号)

# 精确匹配(引号):匹配包含确切单词 wild 的行
echo -e "wild.txt\nwilderness.jpg\nbewildered.py" | fzf -q "'wild"

3.5.5 反向精确匹配 (感叹号)

# 反向精确匹配:匹配不包含 fire 的行
echo -e "water.txt\nearth.html\nfire.py\nair.css" | fzf -q "!fire"

3.5.6 反向后缀匹配

# 反向后缀匹配:匹配不以 .mp3 结尾的行
echo -e "song.mp3\nscript.py\ndocument.pdf\naudio.wav" | fzf -q "!.mp3$"

3.5.7 或操作

# 或操作:匹配以 core 开头,以 go/rb/py 结尾的行
echo -e "core.go\ncore.rb\ncore.py\nutils.js\ncore.java" | fzf -q "^core go$|rb$|py$"

04 参数与变量

# 设置默认的命令,例如使用 fd 或 ag 替代默认的 find,以提升速度
export FZF_DEFAULT_COMMAND='fd --type f --hidden --follow --exclude .git'

# 设置默认选项,让 fzf 更符合你的使用习惯
export FZF_DEFAULT_OPTS="--height 40% --layout=reverse --border --preview-window=right:60% --preview='bat --style=numbers,changes --color=always {}'"

# 为 Ctrl-T 快捷键单独设置选项,例如启用预览
export FZF_CTRL_T_OPTS="--preview '(highlight -O ansi -l {} 2> /dev/null || cat {} || tree -C {}) 2> /dev/null | head -200'"

05 使用场景

场景 命令示例
快速编辑文件 vim $(fzf)
搜索并切换目录 cd $(find . -type d | fzf)
搜索并杀死进程 kill -9 $(ps aux | fzf | awk '{print $2}')
在 Git 分支间切换 git checkout $(git branch | fzf)
搜索历史命令并执行 按 Ctrl-R (通常 fzf 已集成到 shell 历史搜索)
通过 SSH 连接主机 ssh $(cat ~/.ssh/known_hosts | cut -f 1 -d ' ' | fzf)
posted on 2025-10-21 00:04  风惊庭前叶  阅读(1)  评论(0)    收藏  举报