🔍 fzf:终端模糊查找神器,效率提升利器!🚀

在日常开发和运维中,命令行工具就像程序员的"瑞士军刀"。今天要介绍的 fzf(Fuzzy Finder) ,是一个能让你在终端中快速筛选、查找、执行命令的神器。无论你是 Linux、macOS 还是 Windows(通过 WSL)用户,fzf 都能让你的命令行效率翻倍!


🧰 什么是 fzf?

fzf (Fuzzy Finder)是一款命令行下的模糊搜索工具,能帮助你在终端中快速从一堆选项中找到你想要的内容。

🔑 核心功能

  • 实时模糊搜索
  • 支持命令行交互
  • 可与 Git、Docker、Zsh、Tmux 等工具集成
  • 跨平台支持(Linux、macOS、Windows)

🔗 GitHub 地址:github.com/junegunn/fz...


🚀 为什么你需要 fzf?

在没有 fzf 的时候,我们可能需要手动输入命令、翻查历史记录,效率低下,ctrl + r 记录的内容有限。而 fzf 能帮你: ✅ 快速打开最近修改的文件 ✅ 搜索并执行命令历史 ✅ 查找并进入某个目录 ✅ 快速切换 Git 分支或提交记录 ✅ 过滤并查看运行中的进程

效率提升小计算:每天节省 10 分钟命令行查找时间,一年就能节省 60 小时!


🛠️ 安装方式(以 Linux/macOS 为例)

方法 1:使用 Homebrew(macOS 推荐)

bash 复制代码
brew install fzf

安装 shell 插件(绑定快捷键):

bash 复制代码
$(brew --prefix)/opt/fzf/install

方法 2:使用 Git 安装(Linux)

bash 复制代码
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install

安装完成后,重启终端即可使用!


🧑💻 玩法:以centos7 bash 函数为例实现快速执行命令

步骤 1:安装 fzf

bash 复制代码
# 下载源码
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
# 安装
cd ~/.fzf
./install

步骤 2:配置片段文件

创建常用命令库:

bash 复制代码
cat > ~/.my_snippets.txt <<EOF
# 常用命令
ls -lh
ps aux | grep ceph
df -h
free -m
tail -f /var/log/messages
git log --oneline -10
docker ps
EOF

步骤 3:配置 bash 函数

将以下代码加入 ~/.bashrc

bash 复制代码
# 内部函数:选择命令
_snip_choose() {
    local file="$HOME/.my_snippets.txt"
    [[ -f "$file" ]] || return 1
    grep -v ^\s*# "$file" | grep -v ^\s*$ | fzf --height 40% --prompt="🔍 Snip> "
}

# 绑定快捷键 Ctrl+G
_snip_inject() {
    local cmd=$(_snip_choose)
    if [[ -n "$cmd" ]]; then
        READLINE_LINE="$cmd"
        READLINE_POINT=${#cmd}
    fi
}
bind -x "\C-g": _snip_inject

步骤 4:重载配置

bash 复制代码
source ~/.bashrc

使用方法 💡

  1. 按下 Ctrl + G 唤出搜索框
  2. 输入关键词(如 git)→ 选择命令 → 按 Enter
  3. 命令自动出现在终端,直接执行!

🧬 高级功能:支持参数的命令

示例:带占位符的命令

~/.my_snippets.txt 中添加:

bash 复制代码
cat > ~/.my_snippets.txt <<EOF
# File transfer
scp <local_file> <user>@<remote_host>:<remote_path>
rsync -av <src_dir>/ <dest_dir>/

# Logs
tail -f /var/log/<service>.log
grep "<pattern>" /var/log/messages

# Docker
docker exec -it <container_name> /bin/bash
docker run -d --name <name> <image>

# Network
ping <host>
curl -X POST http://<api_host>:<port>/<endpoint>
EOF

修改函数支持占位符

可以使用修改参数的指令,自动在第一个参数位置修改指令

bash 复制代码
# ~/.bashrc

# 从片段文件选择命令(带 <...> 占位符)
_snip_choose() {
    local file="$HOME/.my_snippets.txt"
    [[ -f "$file" ]] || { echo "❌ $file not found" >&2; return 1; }
    grep -v '^\s*#' "$file" | grep -v '^\s*$' | fzf --height 40% --reverse --prompt="🔍 Snip> "
}

# 注入并清理占位符
_snip_inject() {
    local raw_cmd
    raw_cmd=$(_snip_choose) || return 1

    if [[ -n "$raw_cmd" ]]; then
        # Step 1: 移除所有 <...> 的尖括号,保留内容
        # 例如: "scp <file> user@<host>" → "scp file user@host"
        local clean_cmd=""
        local i=0
        local len=${#raw_cmd}
        local in_placeholder=false
        local first_placeholder_pos=-1

        while (( i < len )); do
            local char="${raw_cmd:i:1}"
            if [[ "$char" == "<" && "$in_placeholder" == false ]]; then
                in_placeholder=true
                # 记录第一个占位符内容的起始位置(在 clean_cmd 中的位置)
                if (( first_placeholder_pos == -1 )); then
                    first_placeholder_pos=${#clean_cmd}
                fi
            elif [[ "$char" == ">" && "$in_placeholder" == true ]]; then
                in_placeholder=false
            elif [[ "$in_placeholder" == false ]]; then
                clean_cmd+="$char"
            else
                # 在 <...> 内部,只保留内容(去掉 '<' 和 '>')
                clean_cmd+="$char"
            fi
            ((i++))
        done

        # Step 2: 设置命令行内容
        READLINE_LINE="$clean_cmd"

        # Step 3: 定位光标
        if (( first_placeholder_pos >= 0 )); then
            READLINE_POINT=$first_placeholder_pos
        else
            READLINE_POINT=${#clean_cmd}  # 无占位符,光标放末尾
        fi
    fi
}

# 绑定快捷键 Ctrl+G
bind -x '"\C-g": _snip_inject'

重新加载配置即可

bash 复制代码
source ~/.bashrc

使用效果

  • 输入 ping <host>,光标自动跳到 host 位置,方便快速修改。
  • 在使用快捷键删除按 Ctrl+K(删除从光标到行尾)或按 Alt+D(删除下一个词)

📈 小结:fzf 是你的效率工具吗?

优点 劣势
✅ 开源免费,跨平台 ❗ 需熟悉命令行基础
✅ 与主流工具深度集成 ❗ 初学者需适应交互界面
✅ 极大提升查找效率

适合人群:每天敲命令、查文件、翻历史的开发者、运维、DevOps 工程师。

相关推荐
Jing_Rainbow14 分钟前
【AI-5 全栈-1 /Lesson9(2025-10-29)】构建一个现代前端 AI 图标生成器:从零到完整实现 (含 AIGC 与后端工程详解)🧠
前端·后端
追风少年浪子彦40 分钟前
Spring Boot 使用自定义 JsonDeserializer 同时支持多种日期格式
java·spring boot·后端
bcbnb41 分钟前
Charles抓包在复杂系统中的应用,高难度问题的诊断与验证方法
后端
tan180°1 小时前
Linux网络IP(下)(16)
linux·网络·后端·tcp/ip
非优秀程序员1 小时前
教程:如何修改 Docker 容器 bisheng-frontend 中的静态文件
后端
我叫黑大帅1 小时前
六边形架构?小白也能秒懂的「抗造代码秘诀」
java·后端·架构
kevinzeng1 小时前
结合Condition实现生产者与消费者示例,来进一步分析AbstractQueuedSynchronizer的内部工作机制
后端
戴着眼镜的平头哥1 小时前
前端卷Java系列之一个接口的诞生
后端
9号达人1 小时前
@NotBlank 不生效报错 No validator could be found:Hibernate Validator 版本匹配指北
后端·面试·程序员