上一节讲了「命令怎么被机器理解」,这一节把最常用的指令按用途分成九组,做成一张能查的网——不是让你背,而是让你知道「想干这件事,该去找哪个命令」。每一组都给了最常用的三五个,以及新手最容易用错的地方。
3-5 已经给过「六组必备命令」的入门版——本节是它的完整版:补上进程、系统信息、文本处理、打包压缩、网络下载这五块,并且把每一组的"血泪点"标出来。
4-1 讲了「命令住哪儿、三条流怎么分」——读本节时请随时回去对照,你会发现每个命令都被那套机制罩着。
权限类命令(chmod/chown/sudo)与安装类命令(apt)本节只列名字,不展开——它们各自有专节:4-3 和 4-5。
一、九组命令总览(先有个地图)
| 组 | 用途 | 代表命令 |
|---|---|---|
| ① 看位置 | 我在哪、这儿有什么 | pwd ls cd tree |
| ② 建删搬 | 造、删、复制、移动、链接 | mkdir touch cp mv rm ln |
| ③ 看内容 | 读文件、改文件 | cat less head tail nano |
| ④ 找 | 找文件、找文件里的字 | find grep |
| ⑤ 文本处理 | 数、排、去重、比、切 | wc sort uniq diff cut |
| ⑥ 打包压缩 | 装成一包、解开一包 | tar zip unzip gzip |
| ⑦ 进程与资源 | 谁在跑、吃多少、杀掉 | ps top free df du kill |
| ⑧ 网络 | 通不通、下载、看 IP | ping curl wget ip ss |
| ⑨ 系统与服务 | 重启、时间、启停服务 | systemctl reboot date history |
这张表不用背,用的时候回来查就行。真正要养成的只有一个习惯:想干一件事之前,先想「它属于哪一组」——找对组,命令基本就浮出来了。
二、第①组:看位置(我在哪、这儿有什么)
| 命令 | 干什么 | 常用写法 | 备注 |
|---|---|---|---|
pwd |
打印当前路径 | pwd |
print working directory |
ls |
列出目录内容 | ls -l(详细)、ls -a(含隐藏)、ls -lh(大小带单位)、ls -lt(按时间排) |
最该练熟的命令 |
cd |
变换目录 | cd /etc、cd ..、cd ~、cd -(回上一个目录) |
cd - 很多人不知道,极好用 |
tree |
用树形画出目录 | tree -L 2(只看两层) |
默认没装,sudo apt install tree(4-5 讲) |
ls -l 那一行到底写了什么(下一节 4-3 会逐位拆开讲权限,这里先认识轮廓):
-rw-r--r-- 1 pi pi 4096 9月 24 10:30 notes.txt
│└┬┘└┬┘└┬┘ │ │ │ │ │ └ 文件名
│ │ │ └── 其他人权限 │ │ └ 修改时间
│ │ └───── 同组权限 │ └ 大小(字节)
│ └──────── 拥有者权限 └ 所属组
└ 类型(-文件 / d目录 / l链接)
ls 默认不显示隐藏文件。Linux 里以 . 开头的文件就是隐藏文件(如 .bashrc、.ssh),要 ls -a 才看得见。
新手常犯的错是「我明明建的这个文件怎么不见了」——先想是不是以 . 开头(touch .test.txt 就会「消失」)。
三、第②组:建、删、搬、复制、链接
| 命令 | 干什么 | 例子 | 血泪点 |
|---|---|---|---|
mkdir |
建目录 | mkdir -p a/b/c |
-p 能一次建多层;不加 -p 且父目录不存在会报错 |
touch |
建空文件/改时间戳 | touch note.txt |
文件已存在时不会清空内容,只更新时间 |
cp |
复制 | cp a.txt b.txt、cp -r dir1 dir2 |
复制目录必须加 -r,忘加就报错 |
mv |
移动/改名 | mv a.txt b.txt(改名)、mv a.txt ~/docs/ |
同一个命令既管移动也管改名——因为本质都是「换个名字位置」 |
rm |
删除 | rm a.txt、rm -r dir、rm -rf dir |
没有回收站!见下面警告框 |
ln |
建链接 | ln -s /usr/bin/python3 py3(软链接) |
-s 一定要加;不加是「硬链接」,新手基本用不到 |
它没有回收站、删了就没了、也不会问你「确定吗」。
三条保命规矩:
1. 拿不准就把命令头换成 ls——rm *.log 改成 ls *.log,看一眼命中哪些再决定删不删。
2. rm -rf 后面永远不要出现空格可能的歧义:rm -rf / etc 和 rm -rf /etc 是两个完全不同的结果,多一个空格就是灾难。
3. 路径里的 ~ 和 / 分清:rm -r ~/tmp 是家目录下的 tmp,rm -r /tmp 是系统临时目录,别写错。
记住这一条:在 Linux 里,「后悔」这件事要靠删之前那一眼,不能靠删之后。
软链接为什么有用:它像 Windows 的「快捷方式」,删掉链接不影响原文件;常用于给「版本号很长的程序名」起个短名字。
ln -s /usr/bin/python3 ~/py3 # 建一个短名字
~/py3 --version # 等于 python3 --version
rm ~/py3 # 删掉链接,python3 本体毫发无伤
四、第③组:看内容与改内容
| 命令 | 干什么 | 例子 | 说明 |
|---|---|---|---|
cat |
一口气打印整个文件 | cat /etc/hostname |
只适合看短文件;长文件会刷屏 |
less |
分页翻看 | less /var/log/syslog |
看长文件正解:空格翻页、/ 搜索、q 退出 |
head |
看开头几行 | head -n 20 file |
默认前 10 行 |
tail |
看结尾几行 | tail -n 20 file、tail -f file |
-f 实时跟踪日志,排查问题的头号工具 |
nano |
简单编辑器 | nano ~/.bashrc |
Ctrl + O 保存、Ctrl + X 退出(3-5 讲过) |
它在做一件事:把文件末尾「拴」在屏幕上——文件一有新内容就立刻显示。
以后你在树莓派上跑一个长期程序、或者看系统日志,就开一个终端 tail -f 盯着,不用反复敲 cat。退出按 Ctrl + C。
顺带记一个加速版:tail -f 配合 grep 只盯关键行——
tail -f /var/log/syslog | grep -i error
五、第④组:找(找文件 vs 找内容)
这是新手最容易混的一对:
| 想找什么 | 用哪个 | 例子 |
|---|---|---|
| 找文件名本身 | find |
find ~ -name "*.py" |
| 找文件里写了什么字 | grep |
grep -r "192.168" ~/ |
| 命令 | 常用写法 | 说明 |
|---|---|---|
find |
find 起点 -name "模式" |
find /home -name "config*" |
find + 按大小/时间 |
find . -size +10M、find . -mtime -7 |
找大文件、找最近改过的 |
grep |
grep 关键词 文件 |
grep error /var/log/syslog |
grep -r |
递归搜整个目录 | grep -rn "TODO" ~/projects(-n 显示行号) |
grep -i |
忽略大小写 | grep -i error log |
grep -v |
反向:不要含这个词的行 | grep -v "^#" config(去掉注释行) |
find的-name参数是「文件名的模式」,里面写*要加引号:find . -name "*.txt"。grep的文件参数是「要搜的内容所在文件」,它不管你文件叫什么名字。
一句话:find 找「壳」,grep 找「瓤」。
另外,全系统找东西还有两个「加速版」(如果你以后要频繁搜代码或文件,值得知道):
grep -rn "关键词" ~/ # 最通用,随树莓派自带
# 若装了 ripgrep(rg)则更快:sudo apt install ripgrep
六、第⑤组:文本处理五件套(小而精,组合起来威力大)
| 命令 | 干什么 | 例子 | 搭配提示 |
|---|---|---|---|
wc |
数行/词/字 | wc -l file(只数行) |
数行最常用:ls -1 \| wc -l 数文件个数 |
sort |
排序 | sort names.txt、sort -n(按数字) |
默认按字母排,纯数字要用 -n,否则 10 会排在 2 前面 |
uniq |
去掉相邻重复行 | sort file \| uniq |
必须先 sort!它只去掉「挨在一起」的重复 |
cut |
按列切 | cut -d: -f1 /etc/passwd |
-d 定分隔符,-f 选第几列 |
diff |
比较两个文件差异 | diff a.txt b.txt |
常用于「改配置前留个备份,改完比比看」 |
把它们串起来的经典一招(统计 /etc/passwd 里每种登录 Shell 各有多少人):
cut -d: -f7 /etc/passwd | sort | uniq -c | sort -rn
拆开读:切出第 7 列(登录 Shell)→ 排序 → 去重并计数 → 按数量从大到小再排。这就是 Unix 的思考方式:每个命令只做一件小事,用管道串成流水线。(| 管道见 3-5)
七、第⑥组:打包与压缩
先分清两件事(新手最容易糊):
- 打包(archive)=把一堆文件装进一个盒子,不缩小。
- 压缩(compress)=把盒子里的空气抽掉,变小。
tar 两条腿都能走:
| 想干什么 | 命令 |
|---|---|
| 打包 + 压缩(最常用) | tar -czvf pack.tar.gz 目录名 |
| 解开 .tar.gz | tar -xzvf pack.tar.gz |
| 只看盒子里有什么(不解开) | tar -tzvf pack.tar.gz |
create 创建 / Extract 解开 / gzip 压缩 / verbose 显示过程 / file 指定文件名。
所以 -czvf =「创建、压缩、边说边做、指定文件名」,-xzvf =「解开、压缩、边说边做、指定文件名」。
f 永远放最后(因为它后面要跟文件名),这是记法里唯一的硬规矩。
跨平台打交道用 zip(因为 Windows 原生认它):
zip -r pack.zip 目录名 # 打包(-r 递归,别忘了)
unzip pack.zip # 解开
unzip -l pack.zip # 只看内容清单
和 3-6 呼应:从 Windows 传一堆文件过来,
zip比tar.gz省事——Windows 双击就能解开,不用装额外软件。
八、第⑦组:进程与资源(机器的「体检表」)
| 命令 | 看什么 | 常用写法 | 说明 |
|---|---|---|---|
ps |
某一刻的进程快照 | ps aux |
全系统所有进程 |
top |
动态实时排行 | top |
按 q 退出;按 M 按内存排、P 按 CPU 排 |
free |
内存用了多少 | free -h |
-h 才有 G/M 单位,否则是一串数字 |
df |
磁盘剩余空间 | df -h |
看「还剩多少」 |
du |
目录占用大小 | du -sh 目录、du -h --max-depth=1 . |
看「谁吃得多」 |
uptime |
开机多久、负载多少 | uptime |
有没有被重启过、机器忙不忙 |
kill |
结束进程 | kill PID、kill -9 PID |
先试不加参数的 kill,不行再 -9 |
df= disk free:按分区看还剩多少空间(树莓派上最关心rootfs那个)。du= disk usage:按目录看占了多少,用来找出「是谁把卡塞满了」。
两者数字对不上是正常的(删除但被进程占用的文件、系统保留区都会造成差值),别为此怀疑人生。
找「谁把 SD 卡吃满了」的标准动作:
df -h # 1. 先看是不是真的快满了
du -h --max-depth=1 ~ | sort -h # 2. 家目录下各占多少,从小到大排
kill -9是「拔电源」级别的手段:程序没机会保存和清理。先试kill PID(温和请它退出),不行再-9。
九、第⑧组:网络(通不通、下东西、我是谁)
| 命令 | 干什么 | 例子 | 说明 |
|---|---|---|---|
ping |
测通不通 | ping -c 4 192.168.1.1 |
一定要加 -c,否则会一直 ping 下去(按 Ctrl + C 停) |
ip a |
看本机 IP | ip a |
新写法;老教程的 ifconfig 已废弃 |
ip r |
看路由表(默认网关) | ip r |
老写法 route -n |
ss |
看端口占用 | ss -tuln |
新写法;老写法 netstat 已废弃 |
curl |
取网页/测试接口 | curl -I https://example.com |
只取响应头,测「通不通」最快 |
wget |
下载文件 | wget 地址 |
树莓派自带,适合下大文件 |
hostname -I |
一行拿到自己的 IP | hostname -I |
比 ip a 输出干净得多 |
ifconfig → ip a、route -n → ip r、netstat → ss。
这三对是「同一个东西的新旧名字」。老命令多数还能装回来,但新系统默认没有——所以照老教程敲会报 command not found,那不是你敲错了。
(这一条在 2-5、3-5 都出现过,这里集中给一次对照。)
十、第⑨组:系统与服务
| 命令 | 干什么 | 例子 | 说明 |
|---|---|---|---|
systemctl status X |
看某服务状态 | systemctl status ssh |
排查服务问题的第一招 |
systemctl start/stop/restart X |
启停服务 | sudo systemctl restart ssh |
改完配置要重启服务才生效 |
systemctl enable/disable X |
开机自启开关 | sudo systemctl enable ssh |
enable=随开机起 |
date |
看/设时间 | date |
时间不对会影响联网与证书(回看 2-4 时区) |
hostname |
看/(临时)设主机名 | hostname |
永久改在 raspi-config 里 |
history |
看敲过的命令 | history、!!(重跑上一条) |
配合 Ctrl + R 搜历史(3-5) |
sudo reboot / sudo poweroff |
重启 / 关机 | — | 永远用命令或菜单,别拔电源 |
现在是 systemctl restart X。看到老教程写 service ssh restart,在树莓派新系统上会报错或提示你用 systemctl。
记法:service 是旧世界的门卫,systemctl 是新世界的管理员。
十一、动手 Demo:把九组各用一个命令串成一次巡检
在树莓派上依次跑这九步,每一步都对应一组命令:
# ① 看位置:我在哪、这儿有什么
pwd && ls -lh
# ② 建删搬:造个工作区(注意 -p)
mkdir -p ~/linux_drill/logs && cd ~/linux_drill
# ③ 看内容:造文件并写入几行
printf 'error: disk full\ninfo: started\nERROR: timeout\ninfo: ok\n' > logs/app.log
cat logs/app.log
# ④ 找:在文件里搜(忽略大小写)、再找文件
grep -in error logs/app.log
find ~/linux_drill -name "*.log"
# ⑤ 文本处理:数行 + 排 + 去重计数
wc -l logs/app.log
cut -d: -f1 logs/app.log | sort | uniq -c
# ⑥ 打包压缩:把工作区打包,再看内容,最后解开到别处
cd ~ && tar -czvf drill.tar.gz linux_drill
tar -tzvf drill.tar.gz
mkdir -p ~/drill_restore && tar -xzvf drill.tar.gz -C ~/drill_restore
# ⑦ 进程与资源:体检
free -h
df -h /
du -sh ~/linux_drill
ps aux | head -n 5
# ⑧ 网络:我是谁、通不通
hostname -I
ping -c 2 1.1.1.1
# ⑨ 系统与服务:看一眼 SSH 服务与时间
systemctl status ssh --no-pager | head -n 5
date
看到什么算成功:
| 步骤 | 预期看到 |
|---|---|
| ③ | 四行文字原样打印出来 |
| ④ | grep 命中 3 行(error、ERROR、ERROR 中的 error——-i 让大小写都算);find 列出 app.log |
| ⑤ | wc -l 得 4;cut/… 那一串输出形如 1 error: disk full…看的是「每行第一个词各出现几次」 |
| ⑥ | tar -tzvf 列出 linux_drill/、linux_drill/logs/、linux_drill/logs/app.log 三条 |
| ⑦ | free 和 df 都带单位(G/M);du 显示的是 KB 级的小数 |
| ⑧ | hostname -I 打出你的局域网 IP;ping 有 2 次回包、0% 丢包 |
| ⑨ | 看到 ssh 服务是 active (running);date 显示当前时间 |
最后清理(一次性把临时东西删掉):
rm -r ~/linux_drill ~/drill_restore ~/drill.tar.gz
ls ~ | grep -E "linux_drill|drill" || echo "清理干净 ✅"
「读结果」提示:第 ⑤ 步那一长串管道是本节的灵魂——它证明「命令可以串成流水线」这件事不是理论。第 ⑦ 步的
df/du组合,是你以后发现「卡满了」时的标准动作。
十二、30 秒实验
验证「sort 默认按字母排,所以数字要加 -n」。
printf '10\n2\n1\n30\n' > /tmp/nums.txt
sort /tmp/nums.txt # 第一遍:不加 -n
sort -n /tmp/nums.txt # 第二遍:加 -n
rm /tmp/nums.txt
你会看到:
- 第一遍输出 1 10 2 30——因为按字符比较,10 的 1 比 2 小,所以 10 排到了 2 前面;
- 第二遍输出 1 2 10 30——这才是你要的数字顺序。
这 30 秒你收获的是:命令的默认行为常常和直觉不一样,而 --help 里那些选项正是为这些「不一样」准备的。以后凡是「排序结果看着怪怪的」,先想是不是忘了 -n。
十三、常见误区
- 「
rm删错了可以到回收站找回来」:没有回收站。 唯一的「后悔药」是删之前用ls看一眼(第六节的那条保命规矩)。 - 「
mv只能移动,改名要用别的命令」:同一个命令。Linux 里「移动」和「改名」本质是一回事——换个名字/位置。 - 「
cp和mv对目录也直接能用」:cp复制目录必须-r;mv目录不用加。 - 「
df和du差不多,随便用一个」:df看分区还剩多少,du看目录占了多少。数字对不上很正常。 - 「
kill -9是最干净的关法」:恰恰相反。它是最后手段,程序没有机会保存和清理。先试不加参数的kill。 - 「
sort/uniq是随便配的」:uniq必须先sort——它只处理「相邻」的重复行,不排序的话根本去不干净。 - 「老命令
ifconfig报错,是我系统坏了」:是命令换代了。ifconfig→ip a、netstat→ss、service→systemctl。 - 「
ping一直刷屏,说明网络有问题」:是你没加-c。它默认无限 ping,按Ctrl+C停。
自测三问
1. 想「找文件名」和「找文件里的字」,分别用哪两个命令?(**`find` 找文件名(`-name`);`grep` 找文件内容**) 2. `tar -czvf` 和 `tar -xzvf` 分别是干什么?那四个字母什么意思?(**创建压缩包/解开压缩包**;`c`=create、`x`=extract、`z`=gzip 压缩、`v`=显示过程、`f`=指定文件名,**`f` 永远放最后**) 3. 想找出「谁把 SD 卡塞满了」,标准两步是哪两条命令?(**`df -h` 看哪个分区满 → `du -h --max-depth=1 目录 \| sort -h` 找是谁占的**)- ☐ 下一节(4-3 Linux 的用户与文件权限指令)
相关笔记
- 在 Raspberry Pi OS 执行命令 —— 上一章:命令入门六组(本节的完整版底稿)
- 启动终端机使用命令行的 Linux 指令 —— 上一节:
PATH、三条流、管道这些机制 - Raspberry Pi OS 应用程序界面 ——
apt install装工具包(如tree)在 4-5 展开 - 在 Windows 和树莓派之间交换文件 ——
zip/tar与跨平台传文件的配合 - 🍓 树莓派 · 索引 —— 全课路线图