这是《与 Shell 对话》系列的第二篇。第一篇教会了你导航文件系统、操作文件。现在你知道了文件放在哪里——但还不知道怎么读里面的内容、怎么从一堆文件里找到你需要的那个。这就是这篇要解决的问题。看完这篇,你将能:查看任意文件的内容、在大量文件中搜索特定文字、使用终端找到电脑上的任何东西。
| 关键词 | 一句话说明 |
|---|---|
| cat | 把文件内容打印到屏幕——全量输出,适合短文件 |
| less | 分页查看文件——看长文件时用它,可以上下翻、可以搜索 |
| head / tail | 只看文件的开头或末尾几行。tail -f 能实时追踪日志 |
| grep | 在文件内容中搜索指定的文字——终端里最强大的搜索工具 |
| 正则表达式 | 一种描述「字符模式」的语言,^ $ . 这些符号不是乱码,是逻辑 |
| find | 按名字/类型/大小/时间搜索文件——精确但语法稍绕 |
| mdfind | macOS 的 Spotlight 搜索——用终端调出你平时在访达里搜东西的能力 |
| file | 检测一个文件到底是什么类型——不信任文件后缀时用它 |
| wc | 统计文件的行数、词数、字节数——Word Count |
| du / df | du 看文件夹占多大空间,df 看硬盘还剩多少空间 |
第一篇里你用 ls 看到了文件名,用 cat 看了练习文件的内容。这一节把所有「看内容」的命令串起来,让你知道什么时候该用哪一个。
cat 文件名 # 把文件内容全部打印到屏幕
cat -n 文件名 # 显示行号
cat 文件1 文件2 # 把多个文件的内容连在一起输出
cat = Concatenate(连接)。它原本的设计意图是把多个文件的内容串起来输出。但对于终端初学者来说,它的主要用途是「看一眼这个文件里有什么」。
想试试的话,找一个小文件试一下:
cat ~/.zshrc # 看看你的 shell 配置文件(很短的)
cat -n ~/.zshrc # 带行号再看一遍
cat 的极限:如果文件超过一屏,内容会快速滚过屏幕。这不是 bug,它就是设计成这样的——把内容"倒"到屏幕上。你需要的是下面这个命令。
「cat 适合看短文件,less 适合看长文件」——把这个口诀记住。用错了会有点狼狈:一个 2000 行的日志文件
cat出来,内容从你眼前飞过,什么都看不到。
less 文件名 # 分页查看文件
less 一次只显示一屏内容,按空格翻到下一屏。这是终端里「看长东西」的标准方式。
进入 less 后的操作键:
| 按键 | 效果 | 备注 |
|---|---|---|
空格 或 f | 向下翻一屏 | 最常用的翻页方式 |
b | 向上翻一屏 | 看过头了往回翻 |
| ↑ ↓ | 逐行上下滚动 | 翻过头几行时用 |
/关键词 | 在文件内搜索 | 输入 / 后打字,回车搜索,n 跳到下一个,N 跳回上一个 |
g | 跳到文件开头 | Go to start |
G | 跳到文件末尾 | Go to end |
= | 显示当前位置在文件中的百分比 | 看进度 |
q | 退出 less | 不退出你就卡在这儿了 |
试一下:
less /etc/passwd # Mac 的用户账户文件,看看里面是什么
# 进入 less 后:按空格翻页,按 / 搜索你的用户名,按 q 退出
less 不只是用来读文件的。 很多命令的输出也可以「管道」给 less——这个管道符号 | 下一篇会详细讲,但你可以先试一下:
ls -la /System/Library | less
# ls -la 的输出很长,但通过管道送给 less 后,就可以翻页看了
还记得上一篇的 man 命令吗?man ls 打开的手册页就是通过 less 显示的——所以翻页和退出的操作一模一样。
more是早于less的翻页工具。less 在功能上是 more 的超集(所以有个玩笑:less is more)。你现在只需要 less,不需要 more。
head 只看文件开头,tail 只看文件末尾:
head 文件名 # 默认显示前 10 行
head -n 20 文件名 # 显示前 20 行
tail 文件名 # 默认显示后 10 行
tail -n 20 文件名 # 显示后 20 行
试一下:
head -n 5 ~/.zshrc # 看配置文件的前 5 行
tail -n 5 ~/.zshrc # 看配置文件的最后 5 行
看起来很简单,但 tail 有一个绝招——-f(follow)模式:
tail -f 文件名 # 持续跟踪文件末尾,新内容实时显示
这是系统管理员最常用的命令之一。当某个程序在写日志文件时,tail -f 让你实时看到新写入的每一行。按 Ctrl + C 退出跟踪。
# 尝试跟踪系统日志(需要退出时按 Ctrl + C)
# 注意:如果你的 Mac 提示 Permission denied,说明该文件需要
# 管理员权限才能读取——这是正常的,换一个你权限内的文件试
tail -f /var/log/system.log
tail -f的场景:你下载一个大文件,想看进度日志有没有更新;你在调试程序,想实时看错误输出;服务器出了问题,你 SSH 上去tail -f /var/log/nginx/error.log看最新报错。以后你会有无数次用到它。但注意:
tail -f一旦运行就一直占用终端,不会自动退出。每次有新内容追加到文件末尾,它就会立即显示出来。想停止时按Ctrl + C。这不是卡住了——它是在等你按停止。
grep 是终端世界里最重要的命令之一。它的工作极其单纯:在文件内容中搜索指定的文字,把匹配到的行打印出来。
它的名字源自一个古老的行编辑器命令 g/re/p:Global Regular Expression Print。但你不需要记住这个——你只需要知道它怎么用。
grep "关键词" 文件名 # 在文件中搜索,显示包含关键词的行
grep -i "关键词" 文件名 # 忽略大小写
grep -n "关键词" 文件名 # 同时显示行号
grep -c "关键词" 文件名 # 只统计匹配的行数,不显示内容
grep -v "关键词" 文件名 # 反向匹配——显示不包含关键词的行
grep 默认会在匹配的文字上加颜色高亮(在大多数 Mac 上已经是彩色的)。如果你的终端没显示颜色,可以主动加上:
grep --color=auto "关键词" 文件名 # 带颜色高亮显示匹配文字
试一下:
grep "export" ~/.zshrc # 看看配置文件里有哪些 export 语句
grep -n "PATH" ~/.zshrc # 带行号看 PATH 相关设置
grep -c "alias" ~/.zshrc # 统计你设了多少个别名
grep -v "^#" ~/.zshrc # 不看注释行(排除以 # 开头的行),只看有效配置
当你不知道关键词在哪个文件中——或者想在所有文件里搜索时,-r(recursive,递归)搜索整个目录:
grep -r "关键文字" ~/Desktop/领域 # 在 Desktop/领域 里搜索
grep -ri "terminal" ~/Desktop # 递归 + 忽略大小写
grep -rl "TODO" ~/Desktop # -l 只显示包含匹配的文件名,不显示内容
grep -rL "TODO" ~/Desktop # -L 只显示不包含匹配的文件名(反向的 -l)
grep -rn "sleepnow" ~/Desktop # 递归 + 显示行号
在实际使用中,这几个选项可以任意组合。最常用的组合是 grep -rin "文字" 目录——递归、忽略大小写、显示行号、在一个目录里搜。
一个经常被混淆的点:
grep搜索的是文件内容,而不是文件名。想搜索文件名要用find或mdfind(下一节)。grep "python" 文件是找文件里写了「python」这个单词的行;find . -name "*python*"是找名字里带「python」的文件。两者完全不同。
上一篇提到管道 | 可以把一个命令的输出传给另一个命令。grep 是管道最经典的搭档:
history | grep "ssh" # 在命令历史中搜索所有带 ssh 的命令
ls -la ~/Desktop | grep "2026" # 只显示 Desktop 里日期含 2026 的文件
这是 grep 的真正威力所在——它不只能搜索文件,还能搜索任何命令的输出。第三篇会系统讲管道,但现在先记住这种模式:命令 | grep 关键词。
grep 搜索时,"关键词" 里的内容不只是普通文字——它可以包含一些特殊符号来表示模式。这叫正则表达式(Regular Expression,简称 regex)。以下是三个最基础的:
| 符号 | 含义 | 例子 | 匹配什么 |
|---|---|---|---|
^ | 行首 | grep "^export" 文件 | 以 export 开头的行 |
$ | 行尾 | grep "true$" 文件 | 以 true 结尾的行 |
. | 任意一个字符 | grep "c.t" 文件 | cat、cut、cot 都匹配——中间任意一字 |
# 在配置文件里试试正则
grep "^#" ~/.zshrc # 所有以 # 开头的行(注释)
grep -v "^#" ~/.zshrc # 所有不以 # 开头的行(有效配置)
grep -v "^$" ~/.zshrc # 排除空行(更干净的版本:有效行 + 非空)
正则表达式是整个系列里最值得单独深入的话题。这篇只是让你知道它的存在——符号不是乱码,是逻辑。后面我们会专门展开。
grep 默认使用基础正则(BRE),有些符号(如
+?{})需要用\转义才能使用。加上-E选项可以切换到扩展正则(ERE),更接近你学到的标准正则。现在你只需要知道:当你的正则不按预期工作时,试试grep -E。
grep 搜索的是文件内容。那文件名呢?你想找到一个叫"笔记"的文件但不记得它在哪——这时用 find 或 mdfind。
find 起点目录 -name "文件名" # 按名字查找
find 的第一参数是从哪开始找,然后才是条件。
find ~/Desktop -name "*.md" # Desktop 下所有 .md 文件
find ~/Desktop -name "*笔记*" # 名字里带"笔记"的文件
find ~/Desktop -name "*.md" -type f # 只看文件(不包含文件夹)
find ~/Desktop -name "*.md" -type f -size +1M # 只找大于 1MB 的 .md 文件
find ~/Desktop -name "*.md" -type d # 找名字以 .md 结尾的文件夹
常用的 -type 选项:
| 类型 | 含义 |
|---|---|
-type f | 只找文件(file) |
-type d | 只找文件夹(directory) |
-type l | 只找符号链接(link) |
常用的 -name 选项支持通配符——和第一篇学的完全一样:* 匹配任意字符,? 匹配单个字符。
find的搜索范围由你指定的起点决定。不给起点默认为当前目录(.)。find ~会搜索整个用户文件夹——范围越大越慢。尽量把搜索范围收窄,比如从~/Desktop而不是/开始找。
find 可以找到文件后直接删除:
find ~/Desktop -name "*.tmp" -delete # 删除所有 .tmp 文件(⚠️ 谨慎!)
和 rm 一样,find -delete 不会进废纸篓。永远先用不带 -delete 的版本跑一遍,确认找到的是你想删的东西,再加 -delete。
# 安全做法:先看找到什么
find ~/Desktop -name "*.tmp"
# 确认无误后,再删
find ~/Desktop -name "*.tmp" -delete
find 很强大,但它的语法对初学者来说有点绕。如果你只是想快速找到文件,macOS 提供了一个更友好的方式——mdfind,它调用的是你平时在访达右上角搜索时用的 Spotlight 索引。
mdfind 关键词 # 搜索所有包含该关键词的文件
mdfind -name 文件名 # 按文件名搜索
mdfind -onlyin 目录 关键词 # 只在指定目录内搜索
试一下:
mdfind 睡眠 # 搜索所有包含"睡眠"的文件(不限文件名和内容)
mdfind -name "pmset" # 搜索文件名带 pmset 的文件
mdfind -onlyin ~/Desktop 终端 # 只在桌面范围内搜索"终端"
mdfind 比 find 快的多——因为它不是实时遍历文件系统,而是查预先建好的索引。代价是新创建的文件可能不会立刻出现在结果中(索引有延迟)。
| 场景 | 用 find | 用 mdfind |
|---|---|---|
| 按文件名搜索 | ✅ find ~ -name "*.md" | ✅ mdfind -name ".md" |
| 按文件内容搜索 | 搭配 grep 使用 | ✅ 直接 mdfind 关键词 |
| 按大小/时间搜索 | ✅ 支持 -size -mtime | ❌ 不支持(需配合其他工具) |
| 刚创建的文件 | ✅ 立刻能找到 | ⚠️ 可能需等索引更新 |
一个实用原则:日常随便找文件用
mdfind(快、简单);需要精确条件或要处理刚创建的文件用find。两个都学会,看场景选。
这一节是几个独立的小工具,各自回答一个问题。
文件后缀(.jpg、.pdf、.doc)可以被随意更改,不靠谱。file 命令通过读取文件的头部特征字节来判断真实类型:
file ~/Desktop/图片.png # 检测文件类型
图片.png: PNG image data, 800 x 600, 8-bit/color RGBA, non-interlaced
file /usr/bin/grep # 连可执行文件类型也能检测
/usr/bin/grep: Mach-O 64-bit executable x86_64
file 不讲界面语言——它输出的是文件格式的标准名称,不一定是中文。但信息足够精确:分辨率、颜色深度、编码格式都会显示。
wc = Word Count。统计文件有多少行、多少词、多少字节:
wc ~/.zshrc # 行数、词数、字节数
wc -l ~/.zshrc # 只看行数
wc -c ~/.zshrc # 只看字节数(约等于文件大小)
一个非常实用的组合——配合第一篇的 ls 和通配符,可以快速了解一个目录下的文件数量:
ls ~/Desktop | wc -l # 桌面上有多少个文件和文件夹
ls ~/Desktop/领域 | wc -l # Desktop/领域 里有多少东西
du = Disk Usage。计算文件夹或文件占用了多少磁盘空间:
du -sh ~/Desktop # Desktop 总占用了多大空间(-s 汇总,-h 人类可读)
du -sh ~/Downloads
du -sh ~/Desktop/* # Desktop 里每个项目分别占多大
不加 -s 会递归显示每一级子文件夹的大小——输出非常长。du -sh 是日常最常用的组合,记住它:
| 组合 | 含义 |
|---|---|
du -sh 目录 | 只看该目录的总大小(汇总 + 人类可读) |
du -sh 目录/* | 看该目录下一级各项目的大小 |
du -h 目录 | 递归查看每一级(通常输出太长,配合 less 使用) |
df = Disk Free。查看整个硬盘的容量、已用空间、可用空间:
df -h # 人类可读格式显示所有挂载卷的空间
df -h / # 只看主硬盘
输出示例:
df -h /
Filesystem Size Used Avail Capacity Mounted on
/dev/disk1s1 494Gi 420Gi 70Gi 86% /
从左到右:总容量、已用、可用、使用百分比、挂载点。
三个实用场景:买新电脑前用
df -h看还剩多少空间;感觉电脑变慢时用du -sh ~/Downloads看是不是下载文件夹塞满了;要备份之前用du -sh ~/Desktop ~/Documents先估个大小。
从第一篇到这第二篇,你已经学了系统中最重要的操作和搜索命令。这个练习没有固定的"正确答案"——它是一个探索任务,用你学过的命令去了解你的电脑。
在开始之前,先创建本次练习用的文件夹:
mkdir -p ~/Desktop/终端练习/文档
cd ~/Desktop/终端练习/文档
touch 日记_2026年6月.txt 日记_2026年5月.txt 读书笔记.md 购物清单.txt
现在开始——每个任务都留了操作空间,先自己试,再看下面的参考命令:
用第一篇学到的命令,看看这个文件夹里有哪些文件、各自多大、什么时候创建的。
ls -la ~/Desktop/终端练习/文档
ls -lh ~/Desktop/终端练习/文档
这些文件都是空的(刚创建的)。但你可以用 head 和 tail 来验证它们确实没内容——wc -l 也可以。
# 多文件的组合用法
wc -l ~/Desktop/终端练习/文档/*
head -n 1 ~/Desktop/终端练习/文档/*
空文件没啥好查的。用 mdfind 或 find 在你的电脑上找到一篇你写过的 .md 文件:
# 方法一:用 mdfind 快速搜
mdfind -onlyin ~/Desktop ".md"
# 方法二:用 find 精准搜
find ~/Desktop -name "*.md"
# 选一个你找到的 .md 文件,把路径记下来,接下来我们用这个文件练习
找到文件后,用 less 打开它,在文件内搜索一个你记得出现过的词:
less ~/Desktop/领域/你的文件.md # 把路径换成你找到的文件
# 在 less 里面:
# 空格 → 翻下一页
# /关键词 → 搜索
# n → 跳到下一个匹配
# N → 跳回上一个匹配
# q → 退出
退出 less 后,用 grep 在同一个文件中搜索同一个词,看看 grep 给的行号和在 less 里搜到的位置是否对应得上:
grep -n "关键词" ~/Desktop/领域/你的文件.md
# 再试试忽略大小写
grep -in "关键词" ~/Desktop/领域/你的文件.md
用 du 和 df 了解一下磁盘占用:
# 练习文件夹占多大
du -sh ~/Desktop/终端练习
# 你整个桌面占多大
du -sh ~/Desktop
# 主硬盘还剩多少
df -h /
和第一篇一样,练习完清除痕迹:
rm -rf ~/Desktop/终端练习
这个练习的精髓不在于每一步都做对——而在于你开始把命令组合起来用。第一篇学的导航 + 本篇学的查看和搜索,这就是真正的终端工作流。下一篇讲管道后,这些命令还能串成更强大的链条。
| 命令 | 作用 | 最常用法 |
|---|---|---|
cat | 输出文件内容到屏幕 | cat 文件(短文件) cat -n 文件(带行号) |
less | 分页查看文件 | less 文件 → 空格翻页,/关键词搜索,q 退出 |
head | 看文件开头几行 | head -n 20 文件 |
tail | 看文件末尾几行 | tail -n 20 文件 tail -f 文件(实时追踪) |
grep | 在内容中搜索文字 | grep -rin "文字" 目录 命令 | grep 文字 |
find | 按条件搜索文件 | find 目录 -name "模式" -type f |
mdfind | Spotlight 快速搜索 | mdfind 关键词 mdfind -onlyin 目录 关键词 |
file | 检测文件真实类型 | file 文件 |
wc | 统计行数 | wc -l 文件 ls | wc -l(数文件数量) |
du | 查看磁盘用量 | du -sh 目录 |
df | 查看可用空间 | df -h |
本篇提到了但未深入展开的方向,后续篇章会覆盖:
| 的深入使用——把命令串成流水线的完整思路,见第三篇+ ? {} [] \d \w,以及 grep -E 扩展正则grep -A -B -C——匹配行前后各显示几行,看上下文时非常有用find -exec——对找到的每个文件执行一条命令,find . -name "*.png" -exec cp {} ~/备份 \;v 用编辑器打开当前文件,:n 切到下一个文件locate——基于数据库的快速文件搜索(macOS 默认未启用,需手动配置)sort 和 uniq——排序与去重,和管道搭配使用才发挥威力,见第三篇grep -E 到底要不要加——扩展正则 vs 基础正则的差异来源:1970 年代的古老命令遗留