跳转到内容

第 5 章 · 现代命令行小工具

一句话:六个单文件小程序,替代 grep、find、cat、cd、man 里最常用的那部分,再加一个专门处理 JSON 的 jq,在大项目里更快、输出更好读。 用它还是用别的:在终端里找文字、找文件、看 JSON 时用它们;只是偶尔搜一次、不想装东西,用第 4 章 4.3 表里的自带命令;在 VS Code 里点着看,用编辑器的全局搜索(第 1 章)。 核对版本:ripgrep 15.2、fd 10.5、fzf 0.74、jq 1.8、bat 0.26、tlrc 1.13、zoxide 0.10,2026-10

工具 winget brew apt
ripgrep(rg) BurntSushi.ripgrep.MSVC ripgrep ripgrep
fd sharkdp.fd fd fd-find,命令叫 fdfind
fzf junegunn.fzf fzf fzf
jq jqlang.jq jq jq
bat sharkdp.bat bat bat,命令叫 batcat
tldr(用 tlrc 客户端) tldr-pages.tlrc tlrc 无此包,用 GitHub Releases 里的 .deb
zoxide ajeetdsouza.zoxide zoxide zoxide

一次装齐。Windows 装完要关掉终端重开,新命令才找得到(第 4 章 4.6):

终端窗口
winget install BurntSushi.ripgrep.MSVC sharkdp.fd junegunn.fzf jqlang.jq sharkdp.bat tldr-pages.tlrc ajeetdsouza.zoxide
终端窗口
brew install ripgrep fd fzf jq bat tlrc zoxide
sudo apt install ripgrep fd-find fzf jq bat zoxide

查版本,每个工具都是 --version:

终端窗口
rg --version
  • 各替代哪个老命令:rg 替 grep -rn,fd 替 find -name,bat 替 cat,z(zoxide)替 cd,tldr 替 man 里“给我几个例子”那部分。fzf 和 jq 没有对应的老命令:前者把任何列表变成可模糊搜索的选择框,后者按路径从 JSON 里取字段。
  • 默认尊重 .gitignore:rg 和 fd 在 Git 仓库里自动跳过 .gitignore 列出的文件和隐藏文件,所以不会搜进 node_modules、dist。这也是“明明有却搜不到”的原因,见 5.6。
  • 管道串联(Pipeline):它们都读标准输入、写一行一个结果的标准输出,能互相串,也能和 code、xargs 串,比如 fd -e py | fzf 先列出所有 Python 文件再从中挑一个。
  • 写法两边相同:除 5.5 的配置外,本章命令在 bash 和 PowerShell 7 里写法一样;jq 的过滤表达式一律用单引号包起来。

fzf 的快捷键在 Windows、macOS 上相同,都是 Ctrl,不是 Cmd;要先按 5.5 装好 Shell 集成。

任务 命令 说明
找文字
在当前目录下所有文件里找 rg <关键字> 输出文件名、行号和匹配行
只在 Python 文件里找 rg -t py <关键字> rg --type-list 看所有类型名
只列出含关键字的文件名 rg -l <关键字> 适合接管道交给别的命令
找文件
按文件名找 fd <名字> 名字的一部分即可,不用写 *
按扩展名找 fd -e md 找出所有 Markdown 文件
从列表里模糊挑一个 fd -e py | fzf 不接管道时列出当前目录下所有文件
把挑中的文件路径插到命令行 Ctrl+T 先输入 code 和一个空格再按
模糊搜索历史命令 Ctrl+R 替换 Shell 自带的历史搜索
JSON
格式化、着色 jq '.' <文件> 也可以接管道:curl -s <url> | jq '.'
取数组里每一项的某个字段 jq '.items[].name' <文件> 字符串带双引号输出
输出不带引号的纯文本 jq -r '.items[].name' <文件> 交给下一条命令时用
查看与跳转
带行号和语法高亮看文件 bat <文件> 接管道或重定向时自动退化成纯文本
看一条命令的常用例子 tldr tar 第一次运行会自动下载页面库
跳到去过的目录 z <目录片段> 可以给多个片段,如 z proj api

找出调用某个函数的所有文件,在 VS Code 里打开

Section titled “找出调用某个函数的所有文件,在 VS Code 里打开”
  1. 进项目根目录:z <项目名>,没进过就用 cd <项目目录>。
  2. 看所有匹配行,确认没搜错:rg <函数名>。
  3. 只看 Python 文件:rg -t py <函数名>。
  4. 只要文件名:rg -l -t py <函数名>。
  5. 全部在 VS Code 里打开,bash:rg -l -t py <函数名> | xargs code。
  6. PowerShell 写法不同:code (rg -l -t py <函数名>)。
  7. 在 VS Code 里继续改,按 Ctrl+Shift+F 用编辑器的全局搜索定位到具体行(第 1 章)。

从接口返回的 JSON 里只挑需要的字段

Section titled “从接口返回的 JSON 里只挑需要的字段”

下面按 PowerShell 写;bash 里把 curl.exe 换成 curl。先存成文件,反复试过滤式时不用重复请求接口:

  1. 存下返回:curl.exe -s https://api.github.com/repos/BurntSushi/ripgrep -o repo.json。
  2. 格式化看全貌:jq '.' repo.json。
  3. 只看有哪些字段:jq 'keys' repo.json。
  4. 取一个字段:jq '.stargazers_count' repo.json。
  5. 拼成只含需要字段的新对象:jq '{name, stars: .stargazers_count, license: .license.spdx_id}' repo.json。
  6. 数组接口直接接管道,输出纯文本:curl.exe -s "https://api.github.com/repos/jqlang/jq/releases?per_page=3" | jq -r '.[].tag_name'。
  1. 按 5.5 把 fzf 的 Shell 集成写进配置文件,然后重开终端:. $PROFILE 或 source ~/.bashrc。
  2. 按 Ctrl+R,历史命令以列表出现,最近的在最下面。
  3. 输入几个片段,用空格隔开,顺序不限:compose up。
  4. 用方向键上下选中要的那条:↑、↓。
  5. 按 Enter,命令放到命令行上但不执行,改好参数再按一次 Enter;不要了按 Esc。
  6. 同理找文件:先输入 code 和一个空格,按 Ctrl+T 选中文件,路径插到光标处。
配置项 写在哪 作用
ripgrep 配置文件 自己建 ~/.ripgreprc,用环境变量 RIPGREP_CONFIG_PATH 指向它 每次运行 rg 自动带上里面的参数
fzf 的 Shell 集成 ~/.bashrc;PowerShell 写 $PROFILE,用 PSFzf 模块 启用 Ctrl+T、Ctrl+R
zoxide 初始化 ~/.bashrc 或 $PROFILE 的最后一行 启用 z,并在每次换目录时记下目录
tlrc 配置文件 tldr --config-path 的输出,Windows 是 %APPDATA%\tlrc\config.toml 设页面语言,见 5.6

~/.ripgreprc 一行一个参数,注释单独占一行:

终端窗口
# 关键字全小写时不区分大小写,含大写字母时区分
--smart-case
# 跳过压缩过的 JS
--glob=!*.min.js
# 超长的行只显示前 200 个字符
--max-columns=200

PowerShell 先装 PSFzf 模块:Install-Module PSFzf -Scope CurrentUser。然后在 $PROFILE 里加:

终端窗口
$env:RIPGREP_CONFIG_PATH = "$HOME\.ripgreprc" # 让 rg 读配置文件
Import-Module PSFzf # fzf 的 PowerShell 集成
Set-PsFzfOption -PSReadlineChordProvider 'Ctrl+t' -PSReadlineChordReverseHistory 'Ctrl+r' # 绑定 Ctrl+T、Ctrl+R
Invoke-Expression (& { (zoxide init powershell | Out-String) }) # 启用 z,放在最后

bash 在 ~/.bashrc 里加(macOS 的 zsh 写进 ~/.zshrc,两处 bash 换成 zsh):

终端窗口
export RIPGREP_CONFIG_PATH="$HOME/.ripgreprc" # 让 rg 读配置文件
eval "$(fzf --bash)" # 绑定 Ctrl+T、Ctrl+R,需要 fzf 0.48 以上
alias fd=fdfind # 只有 Debian/Ubuntu 需要
alias bat=batcat # 只有 Debian/Ubuntu 需要
eval "$(zoxide init bash)" # 启用 z,放在最后

Ubuntu 24.04 用 apt 装的 fzf 是 0.44,没有 --bash,第二行换成 source /usr/share/doc/fzf/examples/key-bindings.bash。

  • rg 或 fd 找不到明明存在的文件,比如 dist/ 下的构建产物。 原因:两者默认跳过 .gitignore 里的文件和隐藏文件。处理:rg -uu <关键字>,fd -u <名字>。
  • Ubuntu 里输 fd 或 bat 报 Command 'fd' not found,还建议装 fdclone 这类不相干的包。 原因:包名是 fd-find、bat,命令名是 fdfind、batcat。处理:sudo apt install fd-find bat,再按 5.5 加两行 alias。
  • jq 过滤式里带双引号,如 select(.name == "a"),报 jq: error: a/0 is not defined。 原因:Windows PowerShell 5.1 传参时丢掉了内层双引号。处理:改用 PowerShell 7 原样写;5.1 里写成 \"a\",这样写在 7 里反而报错。
  • z <目录片段> 报“术语 ‘z’ 不会被识别…”,或报 zoxide: no match found。 原因:配置文件里没有初始化行,或这个目录装好后还没进去过。处理:按 5.5 加 zoxide init 那行,重开终端,先 cd 进一次。
  • tldr tar 只有英文,tldr -L zh tar 报 error: the specified language is not installed. 原因:tlrc 只下载 LANG 环境变量和配置里列出的语言。处理:配置文件写 [cache] 和 languages = ["zh", "en"],再 tldr --update。
  • ripgrep:安装、用法指南(GUIDE.md)和配置文件写法。
  • fd:各平台安装方法和全部选项的示例。
  • fzf:Shell 集成、快捷键和搜索语法(空格、^、$、! 的含义)。
  • jq 手册:过滤式的全部语法和内置函数,select、map、–arg 都在这里。
  • tldr pages:社区维护的命令示例库,也能在网页上直接查。
  • zoxide:各 Shell 的初始化写法和 z、zi 的用法。