Fzf Fd Rg

好的,这是一个关于 fzffdrg 这三个现代命令行神器(俗称“命令行三剑客”)的用法梗概。它们各自独立时已经非常强大,但组合使用更能发挥出惊人的效率。

核心思想

  • fd: 替代 find,用来 找文件
  • rg (ripgrep): 替代 grep,用来 找文件内容
  • fzf (fuzzy finder): 模糊搜索器,用来 从列表中交互式地选择

它们的共同优点是:快、智能、用户友好


1. fzf - 命令行模糊搜索器

一句话总结:一个交互式的过滤器,可以从任何文本输入中快速筛选并选择一项或多项。

fzf 是这三者中的“粘合剂”,能与各种命令无缝配合。

核心功能

  • 模糊匹配:你不需要输入完整的词,只需输入几个关键字母,它就能找到匹配项。
  • 交互式界面:实时反馈,上下键选择,回车确认。
  • 高度可定制:可以自定义外观、快捷键和预览窗口。
  • 与 Shell 深度集成:可以极大地增强 Ctrl+R(历史命令搜索)、Ctrl+T(文件路径补全)等功能。

常用场景与示例

  1. 基础用法:查找当前目录下的文件 直接运行 fzf,它会列出所有文件和目录,你可以模糊搜索并按回车,它会将你选择的文件名输出到标准输出。

    1
    
    fzf
    
  2. 增强命令历史搜索 (Ctrl+R) 这是 fzf 最受欢迎的功能。安装后,按 Ctrl+R 会调出 fzf 的交互式历史记录搜索界面,比默认的好用一万倍。

  3. 查找文件并用 Vim 打开 结合命令替换 $(...) 或反引号 `...`

    1
    2
    3
    4
    5
    
    # 查找文件,然后用 vim 打开选中的那个
    vim $(fzf)
    
    # 查找并选择多个文件打开
    vim $(fzf --multi)
    
  4. 作为管道中的过滤器 fzf 可以处理任何通过管道 (|) 传给它的文本。

    1
    2
    3
    4
    5
    
    # 从 ps 结果中选择一个进程并结束它
    ps -ef | fzf | awk '{print $2}' | xargs kill -9
    
    # 模糊搜索并切换 git 分支
    git branch | fzf | xargs git checkout
    

2. fd - 一个更简单、更快速的 find

一句话总结:一个为人类设计的、默认配置极佳的找文件工具。

fd 在功能上与 find 类似,但语法更简洁,速度更快。

核心功能

  • 语法简单fd <模式> 即可,不像 find 需要复杂的 -name 等参数。
  • 智能忽略:默认忽略 .gitignore 中定义的文件、隐藏文件和目录。这在项目开发中非常有用。
  • 速度极快:利用并行处理,搜索速度通常比 find 快得多。
  • 彩色输出:结果按文件类型着色,一目了然。

常用场景与示例

  1. 基础用法:查找包含 “report” 的文件

    1
    2
    3
    4
    
    # 在当前目录及子目录中查找
    fd report
    
    # 相当于 find . -iname "*report*"
    
  2. 按扩展名查找

    1
    2
    3
    4
    5
    
    # 查找所有的 markdown 文件
    fd -e md
    
    # 查找所有的 jpg 或 png 文件
    fd -e jpg -e png
    
  3. 按文件类型查找

    1
    2
    3
    4
    5
    6
    7
    8
    
    # 只查找目录
    fd -t d
    
    # 只查找文件
    fd -t f
    
    # 只查找符号链接
    fd -t l
    
  4. 执行命令 -x--exec 参数可以对每个搜索结果执行一个命令。{} 是占位符,代表找到的文件路径。

    1
    2
    3
    4
    5
    6
    
    # 查找所有 zip 文件并解压
    fd -e zip -x unzip {}
    
    # 批量修改文件名(将 .jpeg 改为 .jpg)
    fd -e jpeg -x mv {} {.}.jpg
    # {.}` 代表不含扩展名的路径
    
  5. 覆盖智能忽略 如果你想搜索隐藏文件或被 .gitignore 忽略的文件:

    1
    2
    3
    
    # --hidden: 搜索隐藏文件
    # --no-ignore: 不使用 .gitignore 规则
    fd --hidden --no-ignore '^\.bash'
    

3. rg (ripgrep) - 一个超快的 grep

一句话总结:一个专注于速度和易用性的代码内容搜索工具。

rg 同样默认尊重 .gitignore,并且会自动跳过二进制文件,是程序员日常搜索代码的利器。

核心功能

  • 速度极快:通常是 grepag (The Silver Searcher) 中最快的。
  • 智能忽略:和 fd 一样,默认忽略 .gitignore 和隐藏文件。
  • 优秀输出:彩色高亮、显示行号、自动分组。
  • 跨平台:在 Windows, macOS, Linux 上表现同样出色。

常用场景与示例

  1. 基础用法:在当前目录搜索字符串

    1
    2
    
    # 搜索包含 "main" 的所有行
    rg main
    
  2. 不区分大小写搜索

    1
    
    rg -i "error"
    

    (rg 默认使用智能大小写:如果你的搜索词全小写,它就不区分大小写;如果包含大写,它就精确匹配。)

  3. 仅列出包含匹配项的文件名

    1
    
    rg -l "TODO"
    
  4. 在特定类型的文件中搜索

    1
    2
    3
    4
    5
    
    # 只在 python 文件中搜索 "import"
    rg "import" -t py
    
    # 不在 javascript 文件中搜索 "console.log"
    rg "console.log" -g '!*.js'
    
  5. 显示上下文

    1
    2
    
    # 显示匹配行的前后各 2 行
    rg -C 2 "important_function"
    
  6. 统计匹配数量

    1
    
    rg --count "User"
    

三者合璧:黄金组合

这三个工具的真正威力在于通过管道 (|) 结合,形成强大的工作流。

场景1:查找一个项目中的配置文件,然后交互式选择并打开。

  • fd 负责快速找出所有 .conf 文件。
  • fzf 负责提供交互界面让你选择。
  • vim 负责打开你选择的文件。
1
2
3
4
5
# 1. fd 找到所有以 .conf 结尾的文件
# 2. | 将结果传给 fzf
# 3. fzf 让你模糊搜索并选择一个
# 4. vim 打开最终选定的文件
vim $(fd -e conf | fzf)

场景2:在代码库中搜索一个函数,然后交互式地预览并跳转到该行。

这是最强大的组合之一,需要 fzf 的预览功能。

  • rg 负责搜索函数名,并输出 文件名:行号:内容
  • fzf 负责交互选择,并使用 --preview 功能实时显示文件上下文。
  • vim/vscode 等编辑器负责打开文件并跳转到指定行。
1
2
3
4
5
# rg 搜索 "function_name",--vimgrep 格式化输出
# fzf 读取结果,并使用 bat (一个带高亮的 cat) 来预览文件
# {1} 是文件名, {2} 是行号
rg --vimgrep "function_name" | \
  fzf --preview 'bat --color=always --highlight-line {2} {1}'

当你选中一项后,可以进一步处理 fzf 的输出,提取文件名和行号,然后用编辑器打开。例如:

1
2
3
4
5
# 选中后,提取文件名和行号,用 vim 打开并跳转
ITEM=$(rg --vimgrep "my_api_key" | fzf)
FILE=$(echo $ITEM | cut -d: -f1)
LINE=$(echo $ITEM | cut -d: -f2)
[ -n "$FILE" ] && vim "$FILE" +$LINE

总结表格

工具 核心功能 经典替代品 关键优势
fzf 交互式选择 (无直接替代) 模糊搜索、万物皆可过滤、高度集成
fd 查找文件/目录 find 语法简单、速度快、智能忽略
rg 搜索文件内容 grep, ack, ag 速度极快、智能忽略、输出友好
Licensed under CC BY-NC-SA 4.0
Built with Hugo
Theme Stack designed by Jimmy