第 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
5.1 安装与版本
Section titled “5.1 安装与版本”| 工具 | 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.zoxidebrew install ripgrep fd fzf jq bat tlrc zoxidesudo apt install ripgrep fd-find fzf jq bat zoxide查版本,每个工具都是 --version:
rg --version5.2 五分钟概念
Section titled “5.2 五分钟概念”- 各替代哪个老命令:
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的过滤表达式一律用单引号包起来。
5.3 常用命令
Section titled “5.3 常用命令”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 |
5.4 典型工作流
Section titled “5.4 典型工作流”找出调用某个函数的所有文件,在 VS Code 里打开
Section titled “找出调用某个函数的所有文件,在 VS Code 里打开”- 进项目根目录:
z <项目名>,没进过就用cd <项目目录>。 - 看所有匹配行,确认没搜错:
rg <函数名>。 - 只看 Python 文件:
rg -t py <函数名>。 - 只要文件名:
rg -l -t py <函数名>。 - 全部在 VS Code 里打开,bash:
rg -l -t py <函数名> | xargs code。 - PowerShell 写法不同:
code (rg -l -t py <函数名>)。 - 在 VS Code 里继续改,按
Ctrl+Shift+F用编辑器的全局搜索定位到具体行(第 1 章)。
从接口返回的 JSON 里只挑需要的字段
Section titled “从接口返回的 JSON 里只挑需要的字段”下面按 PowerShell 写;bash 里把 curl.exe 换成 curl。先存成文件,反复试过滤式时不用重复请求接口:
- 存下返回:
curl.exe -s https://api.github.com/repos/BurntSushi/ripgrep -o repo.json。 - 格式化看全貌:
jq '.' repo.json。 - 只看有哪些字段:
jq 'keys' repo.json。 - 取一个字段:
jq '.stargazers_count' repo.json。 - 拼成只含需要字段的新对象:
jq '{name, stars: .stargazers_count, license: .license.spdx_id}' repo.json。 - 数组接口直接接管道,输出纯文本:
curl.exe -s "https://api.github.com/repos/jqlang/jq/releases?per_page=3" | jq -r '.[].tag_name'。
用 fzf 在历史命令里模糊搜索
Section titled “用 fzf 在历史命令里模糊搜索”- 按 5.5 把 fzf 的 Shell 集成写进配置文件,然后重开终端:
. $PROFILE或source ~/.bashrc。 - 按
Ctrl+R,历史命令以列表出现,最近的在最下面。 - 输入几个片段,用空格隔开,顺序不限:
compose up。 - 用方向键上下选中要的那条:
↑、↓。 - 按
Enter,命令放到命令行上但不执行,改好参数再按一次Enter;不要了按Esc。 - 同理找文件:先输入
code和一个空格,按Ctrl+T选中文件,路径插到光标处。
5.5 配置要点
Section titled “5.5 配置要点”| 配置项 | 写在哪 | 作用 |
|---|---|---|
| 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=200PowerShell 先装 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+RInvoke-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。
5.6 注意事项
Section titled “5.6 注意事项”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。