☰
Linux常用命令速查与运维排障:从参数陷阱到破坏性操作自检
2026/11/3 19:33:52 网站建设 项目流程

简介:围绕 Linux 日常操作与运维场景整理的速查型 PDF 文档,面向刚接触 Linux 的开发者、运维新人与需要频繁查命令的在校学生,重点解决命令记不牢、参数易混淆、场景对应不上的问题。压缩包内共 1 个 PDF 文件,体积约 796KB,篇幅紧凑便于随身查阅,按目录操作、文件操作、文件内容查看与编辑、软连接创建删除、压缩解压、文件权限与详细信息等模块编排,每类命令均给出典型写法与参数说明。同时延伸至 Docker 容器常用命令、yum 包管理、端口占用排查、top 与 ps 进程监控、用户与用户组权限配置、内核参数调整以及 lrzsz 文件传输等运维内容,并补充 find 按名称与大小检索、split 大文件拆分等进阶用法。已有 6171 人学习下载,适合当作桌面手册随时翻查,也可用于面试前快速梳理命令体系。

1. 一万人收藏的 Linux 常用命令速查,真正省的是哪一步

运维的日常里,真正让人卡住的,往往不是不会写脚本,而是凌晨翻日志时想不起tail该带哪个参数,或者执行cp -r之后发现目录里套了一层同名文件夹。这份 2022 年整理的 PDF 把 Linux 常用命令按场景摊开:目录与文件操作、内容查看、系统日志位置、软链接、压缩解压、文件权限、docker 容器命令、运维排障、yum 包管理、用户与组、TOP 指标、内核参数。它属于“手边资料”,不是教程:卡住时查一眼就能拿到正确写法,好过在搜索引擎里翻十篇。适合刚接手一台 Linux 服务器、能敲几条命令但不敢乱删的开发者,也适合干了几年、偶尔还是在find和tar参数上出错的老手。一万人收藏说明它确实有用,但收藏并不等于会敲,接下来就按能照着敲、能复现的标准,把这份清单里最常被调出来的部分逐条拆解。

2. 目录与文件操作:mkdir -p、mv 的两种语义和 find -size 的字节陷阱

这一章对应资料的前两节。它们看着简单,实际最容易出问题:mv到底是改名还是搬家、cp -r到底是拷进去还是拷成新名字、find -size里的 c 又代表什么,都是能让人在半小时里反复重试的地方。

2.1 路径三件套:pwd、cd、mkdir 的落点判断

先把“我在哪”和“我要建在哪”分开。pwd打印的是绝对路径,cd的四种变形决定你下一步所有相对路径的基准点:cd ~回家目录、cd -回到上一次所在目录(来回敲两次等于原地打转,这个特性很好用)、cd ..上一级、cd /进根目录。mkdir后面跟的路径如果以/开头就是绝对路径,不带就是基于当前目录的相对路径,./bbb和bbb的结果完全一致,只是前者把“相对”写明了。

pwd # 输出当前所在目录的绝对路径,先确认再动手 clear # 清屏,只是把内容往上滚,不改任何状态 cd ~ # 当前用户家目录 cd - # 上一次访问的目录,来回跳很方便 cd .. # 上一级 cd / # 根目录,从这里开始的所有路径都是绝对的 mkdir aaa # 在当前目录下建 aaa mkdir ./bbb # 显式相对路径,等价于 mkdir bbb mkdir /ccc # 在根目录下建 ccc,需要相应权限 mkdir -p temp/nginx # 父目录不存在就一起建,这条是日常用得最多的 ll # 多数发行版给 ls -l 起的别名,看不到就用 ls -l

mkdir -p的-p是 parents 的意思,它同时抑制了“目录已存在”的报错,所以在脚本里反复执行同一条mkdir -p /data/app/logs是安全的,而mkdir /data/app/logs在父目录缺失时直接返回失败。ll不是标准命令,是 shell 别名,写进脚本时一定换成ls -l,否则换一台机器就报 command not found,这是很常见的一个低级失败。

2.2 mv 的两种语义:改名和搬家,结果完全不同

mv的语义取决于目标路径存不存在、是不是目录。目标不存在时,它是改名;目标已存在且是目录时,它会把源整个塞进目标里面。这条规则同时也适用于cp -r,所以资料里特意给了两个对照写法:

mv tomcat001 tomcat # 同目录下改名,tomcat 不存在 mv /aaa /bbb # /bbb 已存在时,结果是 /bbb/aaa mv bbbb usr/bbb # 搬家并改名,最终是 usr/bbb cp -r /aaa /bbb # /bbb 存在,结果是 /bbb/aaa cp -r /aaa /bbb/aaa # 显式写目标名,绕开歧义 rm -r /bbb # 普通递归删除,每个文件都问你 y/n rm -rf /bbb # 强制递归删除,不提示 rm -rf ./a* # 删当前目录下所有 a 开头的东西 rm -rf ./* # 删当前目录全部内容,这条要非常小心

cp -r /aaa /bbb和cp -r /aaa /bbb/aaa的区别不是风格问题:前者在/bbb存在时得到/bbb/aaa,后者不管/bbb存不存在都得到/bbb/aaa,但如果/bbb不存在,前者会直接把/aaa复制成名为/bbb的目录,结果完全不同。我一般习惯把目标名写全,宁可多敲几个字符,也不去猜 cp 的判断逻辑。

rm -rf ./*这条值得单独提醒:./*不匹配隐藏文件,所以执行完.bashrc、.git之类都还在,看起来“删干净了”,其实没有;反过来,如果当前目录不是你以为的那个目录,rm -rf ./*会把另一个目录里的东西清空。执行前先pwd,再用ls -a看一眼,这两步花不了三秒。

2.3 find 定位与 split 切分:-size 的 c 是按字节精确匹配

find是这份资料里信息密度最高的一段。-name 'b'是精确等于 b,-name 'b*'才是以 b 开头;加不加引号差别很大,不加引号时 shell 会先做通配符展开,find收到的参数就不是你以为的那个。

find / -name 'b' # 精确匹配名为 b 的文件或目录 find / -name 'b*' # 以 b 开头,注意引号必须有 find . -name '*.pyc' -exec rm -rf {} \; # 找到就删 find . -name "*" -size 145800c -print # 先只打印,不删 find . -name "*" -size 145800c -print -exec rm -rf {} \; # 看得见再删

几个参数拆开说:-size 145800c里的c表示按字节精确匹配,不带c默认按 512 字节的块计算,145800 字节会被算成 285 块,条件就对不上了,这个坑我见过不止一次;-print是默认动作,写出来是为了让“先看后删”变成两个可分开执行的步骤;-exec ... {} \;里的{}是当前匹配到的路径占位符,结尾的\;表示对每个结果单独执行一次命令,换成+则是攒一批一次性传进去,文件多的时候后者快得多,但和rm -rf搭配时要格外小心。

split是这份资料里容易被略过、实际很好用的一条,切日志、切备份包、切片上传都会用到:

split -b 10k date.file # 每 10KB 一个,后缀默认 aa ab ac split -b 10k date.file -d -a 3 # -d 用数字后缀,-a 3 表示长度 3:000 001 002 split -b 10k date.file -d -a 3 split_file # 自定义前缀 split -l 10 date.file # 按行切,每个文件 10 行

-b按字节切,支持 k、m 这类单位;-l按行数切,日志按行切比按字节切更安全,不会把一个多字节字符劈成两半;-d换成数字后缀,-a控制后缀长度,默认 2 位在后缀超过 676 个分片时会回绕覆盖,大文件切片记得调大。资料里还有一个-C参数,表示每个分片里单行的最大字节数,实际用得比-l少,知道有这么个东西就行。

3. 文件内容查看与日志定位:less、tail -f、grep 三个开关的组合

这一节对应资料的第三、四节,也是日常工作里调用频率最高的部分。看日志、改配置、找报错,三条路径基本覆盖了 80% 的现场排查。

3.1 cat、more、less 怎么选,以及它们退出后留下的痕迹

cat是全部刷出来,适合小文件,也适合配合管道做二次处理;more和less是分页看,区别在资料里总结得很清楚:less支持上下方向键和 PageUp/PageDown 回翻,more只能往前;less不必读完整文件所以打开更快;最容易被忽略的一条是less退出后 shell 上不会残留刚才的内容,而more会把内容留在终端里,第二次查日志时往上翻容易看串。

cat a.java # 一次性输出全部内容 more a.java # 一页一页往下,不能回退 less a.java # 上下键、PageUp/PageDown 都能用,q 退出 head a.java # 前 10 行 head -n 7 a.java # 前 7 行 tail a.java # 后 10 行 tail -n 7 a.java # 后 7 行 tail -f a.java # 跟着文件末尾走,不退出,日志排查主力

tail -f的-f是 follow,进程会一直盯着文件末尾追加的内容。这里有个容易出错的地方:日志被 logrotate 切割之后,tail -f盯的还是旧文件的 inode,新写入的内容全进了新文件,你会以为服务“不输出日志了”。改用tail -F(等价于--follow=name --retry)会按文件名重新打开,切割后自动跟上。

3.2 grep 的四个开关:-n、-v、-i、-ni 分别解决什么

grep本身不难,难在组合顺序和大小写。资料里给了四个典型用法,其实对应四种完全不同的意图:

grep under 123.txt # 大小写敏感,命中就整行输出 grep -n under 123.txt # 带行号,方便直接跳到配置文件的对应位置 grep -v under 123.txt # 反向,输出不含 under 的行,过滤噪音用 grep -i under 123.txt # 忽略大小写 grep -ni under 123.txt # 行号 + 忽略大小写,日常排错用得最多

-n在改配置文件时价值最高,因为拿到行号后可以直接vim +行号 文件跳过去,省掉在几千行里翻找的过程。-v配合管道能过滤掉大量无关行,比如grep -v DEBUG把调试日志剔掉再看。-i看着无害,但在查 IP、查十六进制 ID 这类场景下大小写敏感反而更准,别养成无脑加-i的习惯。

3.3 日志都放在哪:先从目录结构找,再看历史命令

资料里列了 Red Hat 系常见的日志位置,这张表值得记在脑子里,出问题时能少一次搜索:

路径内容
/var/log/messages系统启动后的信息和错误日志,最常查的一个
/var/log/secure与认证、安全相关的记录
/var/log/maillog邮件相关
/var/log/cron定时任务执行记录
/var/log/boot.log守护进程启动和停止的消息
~/.bash_history当前用户执行过的命令历史

~/.bash_history这条经常被忽略:用户说“我什么都没改”,cat ~/.bash_history加上history | grep 关键词往往能还原出最近动过什么。注意 history 是退出登录时才落盘的,正在用的会话里执行history看到的是内存中的记录,两者可能不一致。

cat /etc/redhat-release用来确认发行版和版本号,这条在排查“为什么别人机器上能跑我这里不行”时是第一步,不同大版本的默认参数、包管理器、甚至netstat在不在,都不一样。

3.4 vim 最小手势与重定向:改配置只需要五个动作

改配置文件绕不开 vim,但日常只需要五个动作,不用学插件和寄存器:

vim a.java # 打开 # i 进入插入模式 # ESC 回到一般模式 # :wq 保存退出 # :q! 不保存强退 # :q 没做修改时退出

:q和:q!的差别在于有没有修改过内容:改过之后:q会提示你必须保存或者加感叹号,这个提示不是 bug,是在拦你误操作。改线上配置前我一般会先cp 配置文件 配置文件.bak.$(date +%F)留一份,vim 的撤销栈在关掉之后就没了,备份才是后悔药。

重定向这块资料里给了>的用法,顺手把>>一起记住,两者差别很大:

echo 'Hello World' > /root/test.txt # 覆盖写,文件不存在则创建 echo 'second line' >> /root/test.txt # 追加写

>会先把文件截断成空再写,对着一个正在被服务读取的配置文件用>,中间那一瞬间服务读到的是空文件,运气不好就是一次故障。要修改正在使用的配置,走“写临时文件 → 校验 → mv 覆盖”的路子更稳妥,mv是原子的。

顺带说下Ctrl+C和Ctrl+Z的区别,这两个键很多人混着用:Ctrl+C是强制中断程序执行,任务结束;Ctrl+Z只是把任务挂起,进程还在,之后可以用fg拉回前台、bg丢到后台继续跑。用Ctrl+Z挂起一个正在写文件的进程,文件锁可能一直不释放,看起来像“服务卡死了”,实际上是你自己按错的。

4. 压缩解压、软链接与文件权限:tar 的顺序、ln 的斜杠和 chmod 的算法

4.1 tar 的参数顺序:-c、-x、-f、-z、-C 各管什么

tar的参数可以连写也可以分开写,但语义固定:第一个字母决定模式(-c创建、-x解开),-f后面紧跟归档文件名,-z表示走 gzip,-C指定解压落点。-C是大写,而且必须放在归档文件之后,位置错了就直接报错。

tar -cvf start.tar a.java b.java # 只打包,不压缩,v 是显示过程 tar -zcvf start.tar.gz ./* # 打包 + gzip 压缩 tar -xvf start.tar # 解到当前目录 tar -xvf start.tar -C usr/local # 解到指定目录,-C 大写且必须在文件名后 tar -zxvf start.tar.gz -C usr/local # 同上,gzip 版本 tar xf node-v12.18.1-linux-x64.tar.xz # xz 不用额外加参数,新版 tar 能自动识别

关于tar.xz,资料里的写法是不带-J,这是对的:较新的 GNU tar 能根据后缀自动选择解压器,加-J反而在老版本上不认。另外-C指定的目录必须已经存在,不存在就先mkdir -p,否则报Cannot open: No such file or directory,这个报错信息指向性很差,第一次遇到容易以为是压缩包损坏。

还有一个细节:tar -zcvf start.tar.gz ./*里的./*不包含隐藏文件。打包整个目录(包括.env、.gitignore这类)要用tar -zcvf x.tar.gz .,注意最后那个点后面没有星号。

4.2 zip 与 unzip:目录必须带 -r,落点用 -d

zip 系列在跨平台传文件时比 tar 更常见,参数少但要记准:

zip lib.zip tomcat.jar # 单个文件 zip -r lib.zip lib/ # 目录必须 -r,否则只打包空壳 zip -r lib.zip tomcat-embed.jar xml-aps.jar # 多个文件 unzip file1.zip # 解到当前目录 unzip -d /usr/app/ english.zip # -d 后面是目录,注意顺序

unzip -d里的-d指 destination directory,容易和zip -d(从压缩包里删除条目)混淆,两者完全不是一回事。另外unzip遇到同名文件会询问是否覆盖,脚本里要加-o静默覆盖,或者-n跳过已存在文件,不写就会卡在交互提示上,这是自动化脚本里非常典型的一种“看起来卡死”。

4.3 ln -s 的斜杠陷阱:创建时别加,删除时更不能加

软链接这一节是整份资料里最容易造成真实损失的段落,原文那句提醒值得原样记住:创建软连接时 data 目录后不加/,删除软连接时最后也不能带/。

ln -s /usr/local/app /data # 创建:/data 是指向 /usr/local/app 的链接 ls -l /data # 第一个字符是 l,箭头指向源目录 rm -rf /data # 删除链接本身,源目录不受影响 rm -rf /data/ # 危险:末尾斜杠让 rm 顺着链接进到源目录里

原因在于rm对路径末尾斜杠的处理:带斜杠时它认为你要操作的是“这个目录里的内容”,于是顺着链接进去了;不带斜杠时它操作的是链接这个文件本身。这条规则不只对软链接成立,对任何目录都一样,只是软链接场景下后果最严重——你以为是删一个快捷方式,实际清空的是源目录。

创建时的斜杠问题在另一个方向:ln -s /usr/local/app/ /data在某些实现下会把源路径规范化成/usr/local/app,看起来没区别,但如果源路径是相对路径,加不加斜杠会直接影响链接解析的基准。稳妥做法是源路径一律写绝对路径、末尾不加斜杠,目标路径也写全,别依赖当前目录。

4.4 从 -rw-r--r-- 读到 chmod:九位权限位怎么算

ls -l第二列那串字符是理解权限的入口。以资料里的-rw-r--r-- 1 root root 34942 Jan 19 2018 bootstrap.jar为例:第一位-表示普通文件(d是目录、l是链接),后面九位分三组,依次是属主、属组、其他人的rwx。r是读、w是写、x是执行,没有对应权限就显示-。所以这行表示属主可读可写不可执行,属组和其他人都只能读。

chmod u+x web.xml # 属主加执行位 chmod g+x web.xml # 属组加执行位 chmod 111 web.xml # ---x--x--x,所有人都只有执行位 chmod 222 web.xml # --w--w--w-,所有人都只有写位 chmod 444 web.xml # -r--r--r--,所有人都只读 chmod 644 bootstrap.jar # rw-r--r--,普通文件最常见的取值 chmod 755 start.sh # rwxr-xr-x,可执行脚本最常见的取值

数字法的算法很简单:r=4、w=2、x=1,每组三位相加。7=4+2+1是全权限,6=4+2是读写,5=4+1是读加执行。记住 644 和 755 这两个常用值,基本够用;剩下那些 111、222 的写法在资料里出现是为了说明字母和数字的对应关系,生产上几乎不会这么配——给一个配置文件所有人可写,比不给权限还危险。

还有一点资料里没展开但绕不开:chmod -R 777 目录是很多人遇到权限问题时的第一反应,它确实能“解决”报错,同时也把问题藏起来了。多数权限报错的原因是属主不对,正确的做法是chown -R 用户:组 目录把归属改对,而不是把权限开到最大。

5. 运维排查与五条踩坑记录:端口、连接状态与 TOP 的水位

这一章对应资料的第九、十、十四节,也是现场最需要“看一眼就知道大概”的部分。命令本身不难,难在知道先看哪个、看到什么算异常。

5.1 端口通不通:按 ping → telnet/nc → 本机 lsof 的顺序验

排查“服务连不上”,顺序很重要。先ping确认主机可达,再用telnet或nc验证端口能不能建连,最后在本机用lsof或ss看是哪个进程在监听。

ping -c 4 203.0.113.10 # -c 4 表示只发 4 个包,别让它一直跑 telnet 203.0.113.10 8093 # 端口层面能不能建连,连上就说明网络和监听都通 nc -zv 203.0.113.10 8093 # 机器上没装 telnet 时的替代 lsof -i:8080 # 本机上谁占用了 8080 netstat -tunlp | grep 8080 # 老系统写法,t/u 是 tcp/udp,n 是数字,l 是监听,p 是进程 ss -tunlp | grep 8080 # 新系统默认带 ss,输出更快,字段含义一致

这里有个判断上的分叉:ping通但telnet不通,问题在防火墙或服务没监听;telnet通但业务报错,问题在应用层,和网络无关。别在ping不通的时候就一头扎进应用日志里,方向错了很难回头。另外netstat -tunlp不加sudo时,看不到不属于自己的进程名和 PID,会显示成-,容易误判成“端口没被占用”。

5.2 用 awk 统计连接状态:ESTABLISHED、CLOSE_WAIT、TIME_WAIT

连接数异常是很多“服务变慢”的真正原因,资料里给的 awk 一行流很实用,值得背下来:

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' netstat -nt | awk '{if($NF=="ESTABLISHED"){wait[$5]++}}END{for(i in wait) print i,wait[i]}' netstat -nt | awk '{if($NF=="CLOSE_WAIT"){wait[$5]++}}END{for(i in wait) print i,wait[i]}' netstat -lt

第一行的思路是:以tcp开头的行,把最后一列(连接状态)作为数组下标自增,最后遍历输出。$NF是 awk 的“最后一列”,$5是第五列(对端地址),这就是后面两行按来源 IP 分组统计的依据。

读这几个状态的经验:TIME_WAIT多通常是短连接频繁创建销毁,属于协议正常行为,数量级在几万才需要动内核参数;CLOSE_WAIT多才是真问题,说明本端收到对方的 FIN 之后没有调close(),通常是应用代码里连接没关,调大内核参数没用,得改代码。看错了方向,越“优化”越慢。

5.3 TOP 的三个水位:负载、%wa、Swap

top输出分上下两块,上面是统计信息区,下面是进程信息区。资料里逐字段解释了一遍,其实日常只需要盯三个地方。

第一行load average: 1.09, 1.04, 0.98是 1、5、15 分钟的平均负载,判断标准要看核数:4 核机器上负载 1.0 只用掉四分之一,16 核机器上跑到 16 才算满。只看这个数不看核数,结论一定错。

%Cpu(s)那一行里,us是用户态、sy是内核态、wa是等 IO、id是空闲。负载高但id也高、wa也高,说明瓶颈在磁盘不在 CPU,这时候加 CPU 毫无意义,该去看iostat。

KiB Mem和KiB Swap两块,free少不代表内存不够,buff/cache是可回收的,真正要看的是available;而Swap的used持续增长才是内存吃紧的信号,swap 一用上,延迟立刻上一个量级。

top # 交互式,按 1 可以展开每个核,按 M 按内存排序,按 P 按 CPU 排序 ps -ef | grep mysql # 静态快照,脚本里更常用 ps aux | grep ssh # aux 和 ef 的列不一样,看内存占比用 aux 更直观 du -sh # 当前目录总占用 du --max-depth=1 # 只看当前目录下一层,找出是哪个子目录在膨胀 df -h # 文件系统层面的使用率,和 du 对不上很常见

du和df结果对不上是经典问题:文件被删除但进程还持有句柄时,du看不到,df却算得进去,用lsof | grep deleted能找到这类“幽灵占用”,重启对应进程才释放。这个现象资料里没写,但它属于看df时一定要知道的事。

5.4 docker 容器的日常六条命令

容器部分资料里给的是最基础的一组,够日常起停调试:

docker images # 本地已有的镜像 docker search mysql # 在仓库里搜,注意这是搜不是拉 docker run -di --name=first -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root <镜像ID> docker ps # 正在运行的 docker ps -a # 包含已退出的,排查起不来时先看这个 docker stop first # 后面几条都用容器名,比 ID 好记 docker start first docker restart first docker rm first # 只能删已停止的,运行中的要加 -f

docker run那一串参数值得逐个看:-d后台运行、-i保持标准输入打开、--name给容器起名(后面所有命令都能用名字代替 ID)、-p 宿主机端口:容器端口(顺序反了就连不上,这是最常见的错)、-e传环境变量。容器起不来的时候先docker ps -a看退出状态码,再看docker logs 容器名,别一上来就删了重建。

5.5 五条踩坑记录:现象、原因、解决

第一条:明明删的是软链接,源目录被清空了。现象是执行rm -rf /data/之后,/usr/local/app里的文件全没了,/data还在。原因是路径末尾的斜杠让rm顺着链接进到了目标目录里。解决:删除软链接时路径末尾绝不加斜杠,执行前先ls -l确认第一个字符是l而不是d。

第二条:tar -zxvf x.tar.gz -C /usr/local报找不到文件。现象是提示Cannot open: No such file or directory,但压缩包明明就在当前目录。原因有两个可能:-C被放到了归档文件名前面,或者目标目录/usr/local不存在。解决:-C必须在归档文件之后,且先mkdir -p把目标目录建好。

第三条:find ... -exec rm -rf {} \;一晚上删了几万个文件。现象是本来只想删特定后缀的小文件,结果把整个项目的静态资源删了。原因是-name的通配符没加引号,被 shell 先展开了,或者写成了"*"。解决:破坏性操作前先把-exec换成-print空跑一遍,确认输出列表没问题再执行;同时加上-maxdepth限制递归深度。

第四条:tail -f突然不输出新日志了。现象是服务还在写日志,tail -f的窗口却一动不动。原因是日志被 logrotate 切走,进程持有的是旧文件的 inode,新内容写进了新文件。解决:改用tail -F,或者tail -f --follow=name --retry,按文件名重开。

第五条:netstat -tunlp | grep 8080没有任何输出,以为端口空着。现象是 grep 结果为空,于是放心启动服务,结果报端口被占用。原因是没有sudo,非 root 用户看不到其他用户的进程信息,那一列显示成-之后 grep 就匹配不上了。解决:加sudo执行,或者改用ss -tunlp。

6. 一条破坏性命令执行前的三道自检

这份速查 PDF 看得再熟,真正能避免事故的也不是记住多少条命令,而是对少数几条“按下去就收不回来”的命令保持固定动作。我自己吃过亏之后固定下来的做法是:凡是rm -rf、mv覆盖、tar解压覆盖目录这三类操作,执行前强制走三道自检。

第一道是确认位置,pwd加ls -la。这看起来像废话,但绝大多数误删都发生在“我以为我在 /tmp,其实我在 /data”的场景里。尤其是通过 SSH 连了多台机器、开了多个窗口的时候,提示符长得几乎一样,pwd是唯一可靠的确认方式。

第二道是把执行换成预览。find ... -exec rm -rf {} \;先换成find ... -print,rm -rf ./a*先换成ls -d ./a*,mv的目标是目录时先ls 目标目录看看里面有没有同名项。预览这一步花的时间,和事后恢复数据的时间不在一个量级上。有一个小技巧是把危险命令写成函数,在真正执行前打印出展开后的完整路径列表并要求输入 yes,多一次确认就多一次反悔的机会。

第三道是留后路。改配置文件前cp 文件 文件.bak.$(date +%F),动目录前先打个tar -zcvf 备份.tar.gz 目录,这两条命令敲起来不到五秒。第 4 章里说过 vim 的撤销栈关掉就没了,tar备份就是那个后悔药。

还有一个验证习惯值得一起养成:任何命令拿不准行为时,先在/tmp下建个空目录做实验。cp -r到底会拷进去还是拷成新名字、tar -C放错位置报什么错、split -a 2超过 676 个分片会怎样,这些都能在两分钟内用几个空文件验证出来,比在搜索引擎里看十种互相矛盾的说法快。常用命令的价值不在于背下来,而在于你知道它的边界在哪、失效时是什么表现。

从那以后我每次在生产机上按回车之前,都会先把命令原样念一遍再决定要不要加那个-f。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询