很多人学 Linux 常用命令的方式,是先收藏一份几百条命令的清单,然后从ls、cd开始背。背了两个星期,以为自己会用 Linux 了,结果真拿到一台出问题的机器,反而不知道先敲哪条命令。我跟 Linux 打了十几年交道,最想纠正的就是这个误区:常用命令不是用来背的,是用来“问”的。命令本身只是工具,真正值钱的是你拿到一台陌生机器后,能通过命令把它“问”清楚的能力。这篇文章不打算写成又一个“常用命令清单”,而是按真实工作场景拆开讲讲,文件操作、系统排障、权限控制、文本处理和网络诊断时,那些命令组合起来该怎么用,以及我踩过的一些坑。
这回的内容适合刚接触 Linux 的初学者,也适合那些能敲出ls和cd、但遇到问题依然无从下手的初级运维或后端开发。我会尽量把每条命令背后“为什么这么用”讲明白,因为实际工作里,命令记不记得住是其次,能不能理解输出、能不能从报错里找到线索,才是拉开差距的地方。
1. 先放下“背命令”的执念,学会让终端告诉你答案
1.1 为什么命令清单总是看了就忘
我见过很多人在笔记里保存过这样的命令:tar -zxvf、chmod 777、kill -9。需要用的时候翻出来对着敲,敲完也不知道发生了什么。这种学习方式的问题在于,它把命令当成了“口诀”,而不是把它当成“提问方式”。tar -zxvf是在问“这个压缩包里有什么,解开它”;chmod 777是在问“谁能读、谁能写、谁能执行”。一旦你理解了命令本身是在向操作系统提问,遇到新场景时,你就会自然去组合命令,而不是每次上网搜答案。
Linux 的命令体系有点像你去一个大型机构办事:先找咨询台(man),再找指引牌(apropos),实在不行还能查历史档案(history)。真正的高手不是记得所有窗口在哪,而是知道怎么问路。
1.2 最该记住的不是命令,而是“帮助系统”
Linux 自带一个被很多人忽略的宝藏:man。大部分人只在报错时看一眼,其实它是最好的命令字典。比如你想知道tar到底有哪些参数,直接:
man tar不过man对新手不太友好,内容又长又密。我平时更喜欢先用tldr这类工具,它把常用参数和典型用法浓缩成几行示例:
tldr tar如果系统里没有tldr,可以用apt install tldr或者dnf install tldr装一个,装完你就知道查命令的速度能提升多少。还有一个容易被忽略的命令是apropos,它按关键词搜索手册页。比如你忘了“修改文件所有者”的命令叫什么,直接敲:
apropos owner它会列出chown、chgrp等相关的命令。这才是“学习 Linux 常用命令”的正确姿势:不需要把所有命令都塞进脑子,只要知道怎么找到它们就行。
1.3 把 history 变成你的“第二大脑”
很多人在终端里反复敲同一条长命令,敲的时候又怕敲错。其实 Bash 有个非常好用的机制:按Ctrl+R进入反向搜索,输入几个字母就能找到历史命令。配合history命令,你还能看到自己最近干过什么。
history | grep "docker"这个组合能帮你复盘:上一次部署时到底执行了哪些步骤?某条命令后面跟了什么参数?很多线上事故就是因为“当时随手敲了个命令,事后忘了具体参数”造成的。我个人的习惯是,每次做完一次比较复杂的操作,就把关键命令记录到项目笔记里,而不是指望终端历史永远都在。终端历史文件~/.bash_history默认可能只保存 1000 条,重要命令真不一定查得到。
这里还有个实用技巧:用history配合grep,比翻聊天记录靠谱得多。有一次我在排查一台测试机上的服务异常,怎么都想不起来之前是用哪个端口启动的,后来通过history | grep "port"直接找到了当时的启动命令,问题瞬间定位。这就是“问”终端的力量。
2. 文件与目录操作:不是“会用 ls”这么简单
2.1 ls 和 find:定位文件的两个层次
ls是大家入门的第一个命令,但很多人只会用ls或者ls -l。实际排查问题时,我更常用ls -lah,其中h让文件大小显示成人类易读的格式,a显示隐藏文件,l显示权限和所有者信息。这三件套组合在一起,能让你一眼看出目录里有没有可疑的隐藏文件、哪个日志文件膨胀得异常。
但ls只能看某个目录里的东西,想全盘找文件就得用find。很多新手觉得find难,因为它参数多。其实核心就几个:
find /var/log -name "*.log" -mtime +7这条命令的意思是:在/var/log下找所有以.log结尾、并且在 7 天前修改过的文件。-mtime是修改时间,+7表示超过 7 天,-7表示 7 天以内。还有一个容易被忽略的-size参数:
find / -type f -size +500M这条命令能帮你在磁盘告警时迅速找到大文件。我接手过一台磁盘写满的机器,当时靠df -h只看到根分区 100% 使用,但不知道谁占的。就是靠这条find命令,定位到了某个程序生成的超大日志文件。find还可以配合-exec做批量操作,比如批量修改权限:
find /data/app -type f -exec chmod 644 {} \;{}是 find 找到的每个文件的占位符,\;表示命令结束。这种写法规避了写脚本循环的麻烦,但也意味着每个文件都会启动一次外部命令。如果文件量特别大,性能会有点影响。
2.2 cp、mv、rm 背后的风险意识
看到cp、mv、rm,很多人觉得太基础。但真正让我吃过亏的是rm的不可逆性。有一次我在某台机器上想删除/tmp下的临时目录,结果手滑多打了一个空格,变成了rm -rf /tmp/ old_data,系统直接报错“目录不存在”,我才意识到自己差点删错地方。从此之后,凡是批量删除,我必先ls一遍确认,再用find的-name参数过滤出来给rm,而不是直接裸敲。
删除文件有一个更安全的中间态,就是先移动到临时目录:
mv ./bad_dir /tmp/to_delete_dir/这样即使删错了,也有机会从/tmp里找回来。等到确认整个目录确实不需要了,再真正执行清理。这个习惯救过我一次,当时我把一个配置目录移动到/tmp,后来发现线上服务还需要其中一个文件,赶紧把它复制了回去。
cp和mv也要注意符号链接的问题。默认情况下cp复制软链接时,会复制链接本身,还是链接指向的文件内容,不同发行版、不同参数下行为不一样。我的经验是,涉及链接文件就用cp -a保留属性,避免搞出“复制过去是个断链”的怪事。
2.3 硬链接与软链接:什么时候用哪个
链接是 Linux 文件系统里特别容易混淆的概念。软链接(symlink)可以跨文件系统,指错了就成断链,ls -l会显示箭头目标;硬链接不能跨文件系统,但它指向的是同一个 inode,删除一个链接,另一个链接依然有效。日常操作中,绝大多数场景用的是软链接,比如把某个程序的配置路径链接到实际存放目录:
ln -s /data/real_config /etc/app_config软链接的好处是灵活,切环境时直接把链接指向另外的目录就行。但软链接也有坑:有些程序解析配置时会用realpath拿到真正的路径,导致你改了软链接指向,程序却还在读旧目录。遇到这种情况,得查启动脚本里是不是用了realpath。硬链接我一般用来做日志归档的快照式保留,比如:
ln /var/log/app.log /var/log/app.log.$(date +%F)创建硬链接后再继续写原文件,日志内容不会丢失。这比cp更快,因为硬链接不复制数据,只是新增一个目录条目。不过硬链接不能在目录和跨文件系统上使用,这是它最核心的限制。
2.4 tar 和 rsync:归档与传输的组合威力
打包压缩这件事,很多人只会一条tar -czvf,但不知道解压时用tar -xzvf,更不知道查看压缩包内容可以用tar -tzvf。我处理线上故障时,经常要确认压缩包里到底有没有某个配置文件,所以习惯先用:
tar -tzvf backup.tar.gz | grep "nginx.conf"这样不用解压就能确认内容,免得解开大一坨文件后又发现不是自己要的。tar的参数顺序也有讲究,-c是创建,-x是解压,-z走 gzip,-v显示过程,-f指定文件名。f必须是最后一个参数,因为它后面跟的是文件名,这是个约定俗成的规矩,记不住就容易踩坑。
跨机器传文件时,我很少用scp硬传大目录,而是用rsync。它最大的优势是断点续传和增量同步,目录里只有一小部分文件变化时,rsync只传变化部分:
rsync -avz --progress /data/app/ user@remote:/backup/app/-a是归档模式,保留权限、属主和时间戳;-v显示详细输出;-z开启压缩。要注意的是,源路径末尾的斜杠很有讲究:/data/app/表示同步目录里的内容,/data/app表示连目录本身一起同步。这个区别曾经让我在某次同步时把目录结构搞错,后来只要是备份,我都会先写rsync -avz --dry-run跑一遍,确认参数无误后再正式执行。
3. 进程与系统资源:真正排障时先看什么
3.1 ps 和 top:静态快照与实时视图的配合
系统卡了,进程没响应,大多数人的第一反应是打开top。top确实直观,但它是实时视图,刷新很快,你不一定来得及看清状态。我更喜欢先用ps抓静态快照:
ps aux --sort=-%cpu | head -20这条命令按 CPU 占用率从高到低排序,只看前 20 条,一眼就能找到谁在吃资源。如果想换成内存排序,就用:
ps aux --sort=-%mem | head -20ps aux的输出里,STAT列非常关键。R表示正在运行,D表示不可中断的睡眠(通常是等待磁盘 I/O),Z表示僵尸进程。我曾经检查一台文件服务器时发现大量D状态进程,后来定位到是底层存储设备的 I/O 排队严重,而不是应用代码出问题。这个排查思路在线上非常实用。
top适合动态观察变化,但它默认显示的 CPU 百分比是单核的,多核机器上要按1才能展开每个核的使用情况。更现代一点的替代是htop,显示更友好,还支持鼠标操作和直接树状查看进程父子关系,我基本用它替代top。另外,查某个进程是否还在运行,用pgrep比ps aux | grep更准确:
pgrep -fa "nginx"-f匹配完整命令行,-a显示进程名和 PID,比裸grep更容易避免误匹配。
3.2 端口与连接:ss 全面替代 netstat
以前排查端口问题都用netstat,但新的系统上netstat不一定预装,而且输出也比较旧。ss是 iproute2 套件里的工具,性能更好,输出也更清晰。最常用的场景是查某个端口是否被监听:
ss -lntp | grep :8080-l只显示监听端口,-n用数字显示端口和地址,-t只看 TCP,-p显示进程信息。加上grep :8080就能定位到 PID。如果端口被占,接着用ps -p <PID>查看具体是什么程序。这比lsof -i:8080更轻量,而且不需要额外安装。
查看当前 TCP 连接状态也常用ss:
ss -s它显示的是整体连接统计,包括建立、等待、关闭等不同状态的数量。排查集群中的大量异常连接时,ss -s是第一个看的。如果TIME-WAIT数量特别大,多半是频繁创建短连接,比如某些请求服务没有启用连接复用。理解这个输出,比记十条命令都管用。
3.3 磁盘与内存:free、df、du 的解读
磁盘报警时先看整体:
df -h-h以易读格式显示。这里有个常见误解:df显示的使用率并不代表真正的可用空间,因为 Linux 会为 root 保留一部分空间,默认一般是 5%。所以当你看到/分区使用率 100% 时,进程可能还能写一点;看到 95% 时,系统可能已经警告了。接着用du找大头:
du -sh /var/log/*-s只汇总每个目录的总大小,-h易读格式。du和前面的find -size是两套互补思路:du看目录树,find按文件元数据过滤。如果日志目录特别大,别忘了du还会把已删除但未释放空间的文件算进去?其实不会,du查看的是当前目录树里的文件大小。真正占用磁盘但找不到大文件的场景,通常是有进程持有已删除文件句柄。这时候用:
lsof +L1它会列出被删除但仍被进程占用的文件。内存方面,free -h也是必备:
free -h输出里有个“buff/cache”列,很多新人看到缓存占用很多就慌,其实这是内核在用内存做文件缓存,压力大的时候会被自动回收。真正需要关注的是available这一列,它表示在不触发换页的情况下还能分配多少内存。判断内存够不够,看available,而不是看free这列,这是我反复提醒自己的一个要点。
3.4 systemctl 与 journalctl:从“启动服务”到“看完整状态”
现在的发行版基本都是 systemd 管理服务,常用命令也变了。启动、停止、重启、查看状态,核心就是:
systemctl status nginx systemctl restart nginx systemctl enable nginx比service命令更强大的是systemctl list-units --type=service --state=failed,它能列出所有失败的服务。排查机器重启后服务没起来的场景,这条命令比逐个status高效得多。
服务起没起来,日志是关键。journalctl是 systemd 统一的日志查询工具,我常用这几种:
journalctl -u nginx -n 100 journalctl -u nginx --since "10 minutes ago" journalctl -u nginx -f-u指定服务单元,-n看最后多少行,--since按时间过滤,-f是实时跟踪。有些程序会写自己的日志文件(比如/var/log/nginx/error.log),但 systemd 的journalctl里也能看到服务进程的标准输出和标准错误。排查启动崩溃时,这两个都要看:先看journalctl里有没有段错误或加载失败的信息,再看业务日志有没有超时或初始化失败的记录。
日志量大的机器,journald会吃掉不少磁盘空间。默认情况下日志大小是有限制的,但如果你发现/var/log/journal目录异常膨胀,可以用journalctl --vacuum-size=500M清理到指定大小。这是排查磁盘空间问题的隐藏点,很多人du -sh /var/log/*看半天,却没注意journal目录。
4. 权限、用户与安全底线
4.1 chmod 和 chown:数字权限的真正含义
chmod 777大概是互联网上最常见的错误命令之一。数字权限的含义很简单:4是读,2是写,1是执行,三位数字分别对应所有者、所属组、其他用户。777就是所有人完全读写执行,等于把你的文件放在大街上任人取用。我见过有人为了让某个 Web 目录能写,直接chmod -R 777,结果网站被人写入木马,整台机器被扫得干干净净。
正确的思路是:按最小权限给。网站目录只需要被运行用户读,写入只需要针对上传目录,执行权限只给需要执行的程序。比如:
chown -R www-data:www-data /data/www chmod -R 750 /data/www chmod -R 770 /data/www/upload这样站点主体是所有者读写执行、组内读取,上传目录才允许组写。chown修改所有者和组,-R递归。改错了所有者也是常见事故来源,所以我每次执行chown -R之前,都会先看一眼当前目录的属主,防止连系统目录一起改掉。
4.2 umask 和默认权限:为什么新建文件总是 644
很多人疑惑:为什么新建的文件是 644,新建的目录是 755?这不是系统随便定的,而是umask决定的。umask是权限掩码,默认通常是022。它的计算方式是:文件默认最大权限666减去掩码022,得到644;目录默认最大权限777减去掩码022,得到755。为什么文件不是666?因为内核默认不给新文件执行权限,这是防止你无意中创建一个可执行脚本的安全设计。
可以用umask命令查看,也可以临时改:
umask 077改成077后,新建的文件是600,只有自己能读,适合存放密钥或敏感脚本。我一般会在需要处理密钥的项目目录里设置umask 077,避免同组用户能读私钥。
4.3 sudo 的正确姿势与 sudoers 最小授权
sudo不是“万能钥匙”,它是受权限策略控制的。它的配置文件/etc/sudoers必须用visudo命令编辑,因为visudo会检查语法,避免搞坏配置后连sudo都无法使用。这个坑我踩过一次:直接改/etc/sudoers改漏了格式,导致该机器所有用户都没法执行sudo,最后只能通过另一个管理员账号接管修复。
日常授权时,不要直接给用户ALL=(ALL) ALL,那是把整个机器的 root 权限交出去。最小授权应该是这样:
deploy ALL=(ALL) /usr/bin/systemctl restart nginx表示deploy用户只能以 root 身份执行systemctl restart nginx。这样的好处是,某用户只能重启 Nginx,却不能改系统配置。对需要执行多个命令的场景,可以建一个组,把命令列表写进sudoers:
%ops ALL=(ALL) /usr/bin/systemctl restart *, /usr/bin/journalctl但这也有个隐患:*通配符有可能被用户注入额外参数,比如/usr/bin/systemctl restart nginx; /bin/bash。所以更严格的策略是把命令路径写死,或者用包装脚本。关于安全策略,不要过度信任 sudoers 的花哨写法,简单明确最稳。
4.4 登录安全基础:passwd、last、who
Linux 日常命令里,用户和登录相关的几个命令也值得补充。last可以查看最近的登录记录:
last -20它能显示登录时间、来源 IP 和持续时长。排查服务器是否被人暴力尝试登录,我一般配合/var/log/auth.log或/var/log/secure:
grep "Failed password" /var/log/auth.log | tail -20如果发现有大量来自不同 IP 的失败尝试,就需要考虑禁用密码登录、改用密钥认证,或者安装防暴力破解工具。改用户密码用passwd <用户名>,锁定账号用usermod -L <用户名>,解锁用usermod -U <用户名>。
还有一个小命令是who,查看当前谁在线;w可以显示在线用户正在执行什么命令。排查“谁在乱动系统”的时候,w的输出非常有价值。
5. 文本处理三剑客:grep、awk、sed 的配合
5.1 grep:从暴力搜索到精准过滤
grep是日志分析的基础。简单搜索:
grep "ERROR" /var/log/app.log但真正用好的关键是参数。-E支持扩展正则,更有人性化的体验;-i忽略大小写;-v反向匹配,排除你不想看的内容;-l显示包含匹配内容的文件名;-c计数。我处理日志时最喜欢的是这套组合:
grep -E "ERROR|WARN" /var/log/app.log | grep -v "healthcheck"先过滤出错误和警告,再排除健康检查的无聊日志。还能用-A 3 -B 2打印匹配行的上下文,能帮你搞清楚错误发生前后的状态:
grep -B 3 -A 5 "OutOfMemoryError" /var/log/app.log-B 3是匹配行前 3 行,-A 5是后 5 行。排查崩溃原因时,上下文比单行信息重要得多。
5.2 sed:流编辑器的典型应用
sed最常被用来替换文本:
sed -i 's/old/new/g' config.conf但-i会直接改原文件,这是很多人害怕的地方。我建议先在无-i的情况下跑一遍,确认输出正确:
sed 's/old/new/g' config.conf | head -20确认无误后再加-i。sed还有一个删除行的场景,比如去掉配置文件里的空行和注释:
sed -i '/^$/d; /^#/d' config.confd表示删除匹配行。不过这种操作要非常小心,如果配置文件里包含了以#开头的密码占位符,删除后配置直接废了。所以我的习惯是,先用grep -n查看要删的匹配内容,再执行sed -i。
sed的另一种常见用法是取某一段文本。比如只想看日志文件的 100 到 200 行:
sed -n '100,200p' app.log-n关闭默认输出,p打印指定范围。这在日志文件特别大,无法用文本文档打开时非常有用。
5.3 awk:列处理用它,别再用循环
如果说grep是行过滤器,sed是文本编辑器,awk就是列处理器。它默认以空白字符分割字段,$1是第一列,$2是第二列,$NF是最后一列。最简单的用法是提取某个字段:
awk '{print $1}' app.log它的真正威力在于按条件处理。比如从访问日志里提取状态码为 500 的请求 IP:
awk '$9 == 500 {print $1}' access.log | sort | uniq -c | sort -rn | head -20这条命令一口气完成了:匹配状态码 500、提取 IP、统计次数、按次数排序、取前 20。sort和uniq也是文本处理里的黄金搭档。uniq -c会统计连续重复的行次数,注意是“连续”,所以必须先sort再uniq,不然相同内容分散在不同位置会统计不出来。
awk里还可以做简单计算。比如统计平均响应时间:
awk '{sum += $NF; count++} END {print sum/count}' access.log假设最后一列是响应时间。这个技巧在分析接口耗时的时候特别有用,不用写一个完整的脚本,一行命令就能得到结果。
5.4 组合实例:从日志里找出最慢的请求
这里的例子,可以把三个工具串起来。假设访问日志格式是:
192.168.1.10 - - [12/Oct/2025:10:15:30 +0800] "GET /api/order HTTP/1.1" 200 532 1.253最后一列是处理耗时。我想找出最慢的 10 个请求及其对应接口:
awk '{print $NF, $7}' access.log | sort -rn | head -10awk提取耗时和请求路径,输出成“耗时 路径”两列;sort -rn按数字降序排列;head -10取前 10 条。
但这里有个细节:如果日志里某些字段不是固定位置,比如 IP 是-或缺字段,awk的列号就会错位,必须先用真实日志样本验证字段位置。我处理过不同格式的日志,有的用$7是请求路径,有的是$6,稍微差一个字段结果就完全没意义。所以每回处理前,都先head -5看日志结构,再决定列号。
要想看某段时间窗口内的慢请求,可以配合sed:
sed -n '/12\/Oct\/2025:10:15/,/12\/Oct\/2025:10:30/p' access.log | awk '{print $NF, $7}' | sort -rn | head -10这里用sed先圈出时间范围,再交给awk处理。三个命令各有分工,各自只做一件事,组合起来就成了一条小型流水线。Linux 的设计哲学在命令行里体现得淋漓尽致:小工具协作,而不是用一个巨型工具包打天下。
6. 网络诊断链路:从 ping 到 curl
6.1 ping 和 traceroute:先确认通不通
网络排查的第一步永远是确认连通性。ping是最直接的:
ping -c 4 192.168.1.100-c 4指定发 4 个包。看结果时,重点不是“丢包”那行,而是延迟有没有波动,以及是否出现Destination Host Unreachable。如果跨机房访问很慢,用traceroute看每一跳的延迟:
traceroute -n 8.8.8.8-n不做域名反解,速度更快,也避免 DNS 拖慢输出。不过traceroute用的是 UDP 或 ICMP,有些网络设备会限制这类探测包,导致结果看起来像丢包,但实际业务是通的。所以它的输出只能作为参考,不能单独下结论。这时候换个思路,用tcping或连接真实端口来测,更贴近业务路径。
6.2 ss 和 lsof:谁占用了端口
端口被占是后端开发最常遇到的报错。ss -lntp应该成为你的肌肉记忆:
ss -lntp | grep :8080如果输出显示某个 PID 占用了端口,再查进程详情:
ps -p 1234 -f如果进程不存在但端口还占着,变成“孤儿连接”,通常需要确认是不是还有其他进程在监听,或者该端口处于TIME-WAIT状态。lsof -i:8080也能查,但lsof不一定预装,ss是更通用的方案。还有一种情况是端口没被监听,但客户端连接被拒绝,这时要确认防火墙规则:
iptables -L -n | grep 8080云服务器上的安全组和本机防火墙是两层,都要检查。很多新手只盯着本机防火墙,忘了云控制台里还有一层规则,结果防火墙明明放行了,公网还是连不上。
6.3 dig 与 curl:解析和请求层的验证
排查域名问题,dig比nslookup更清晰:
dig example.com +short它会返回解析后的 IP。想指定 DNS 服务器测解析,直接后面跟上服务器地址:
dig @8.8.8.8 example.com +short而curl是请求层最常用的诊断工具。我几乎每天都用curl -v看完整链路:
curl -v https://example.com/api/health-v会输出 DNS 解析、TCP 连接、TLS 握手、HTTP 请求响应头。如果连接失败,它能告诉你卡在哪个环节:是 DNS 解析不出,是 TCP 连接被拒,还是证书验证失败。curl -I只拿响应头,适合快速确认服务是否存活:
curl -I http://127.0.0.1:8080/health如果本机curl正常,但外部访问失败,问题就在网络链路、防火墙或反向代理上;如果本机也失败,问题在服务本身。
6.4 一条完整的排查思路
实战中,我通常按这四层走。第一层是本机进程:ss -lntp看服务有没有监听端口;第二层是本机请求:curl -v http://127.0.0.1:端口/health看服务是否正常响应;第三层是网络链路:跨机器ping和traceroute看路由和延迟;第四层是外部访问:确认防火墙规则与域名解析是否正确。
有一次排查一个“外部无法访问”的问题,我按这个顺序走下去,发现本机curl正常、同机房另一台机器也正常,但公网 IP 访问不通。最后定位到是云控制台的安全组没有放行新端口,而本机防火墙是放开的。这个经验告诉我:越接近用户侧的排查,越要先考虑平台层和安全策略,不要总盯着应用代码。
网络诊断里还有一个容易被忽略的命令,mtr。它结合了ping和traceroute的能力,持续显示每一跳的丢包率和延迟,比单独跑traceroute更直观。遇到网络质量问题,我的首选就是mtr -n 目标IP,持续观察几十秒,再结合出口流量和带宽占用情况判断是不是链路拥塞。
写完这些,我发现真正拉开运维效率差距的,往往不是多冷门的命令,而是面对问题时的排查顺序。常用命令就那么几十条,难的是把它们组合成一条顺畅的思路:先问进程,再问端口,然后看日志,最后用文本工具从日志里提取规律。我也不建议一口气学完所有东西,先把手头的场景用熟,比如这周只练文件操作和find,下周只练进程和端口,等这些组合变成肌肉记忆,再往上叠加网络和文本处理工具。那时候你再回头翻“Linux 常用命令”清单,会发现绝大多数命令本来就认识,只是以前没想过它们可以这样配合。