Linux 命令行入门踩坑记录:从 VMware 装系统到文件管理
这学期开了 Linux 课,作业要求把 VMware 装系统的过程、还有命令行的基础知识整理成一篇博客。我本来想着"上机截几张图交差",结果真动手才发现坑不少,索性把过程完整记下来,也算是自己的一份复习笔记。
我用的环境是 VMware Workstation 17.6.4 + Red Hat Enterprise Linux 9.8,装在笔记本上。下面所有命令和输出,都是我在虚拟机里真跑出来的,没有编。
一、用 VMware 装一台 Linux
1.1 先说说选型
教材上一般用 CentOS 或者 Ubuntu,我们课程用的是 RHEL 9.8。企业版的好处是以后考 RHCSA 能直接对上,坏处是下载镜像得费点劲(我用的是课程发的 DVD 镜像 rhel-9.8-x86_64-dvd.iso,14 GB 出头,比 Ubuntu 的大不少)。
VMware 个人用是免费的,装完在"帮助 → 关于"里能看到版本号。我装的是 17.6.4。
1.2 装 VMware
这一步基本无脑点下一步,只有两个地方值得留意:
- 安装路径建议改到 D 盘(或者空间大的盘)。VMware 本体不大,但虚拟机磁盘文件会越滚越大,跟系统盘挤在一起以后会很痛苦。
- 勾选"增强型键盘驱动程序",不然后面在虚拟机里按快捷键容易失灵。
装完需要重启一次,重启后系统里会多出几项 VMware 的网络服务(VMnetDHCP、VMware NAT Service 等),这些服务不要手动关,关了虚拟机上不了网。
1.3 新建虚拟机
打开 VMware,文件 → 新建虚拟机,配置类型选典型就行。几个关键选择:
- 客户机操作系统:Linux,版本选 "Red Hat Enterprise Linux 9 64 位"。选错了影响不大,但 VMware 的推荐配置会不准。
- 安装来源 :我一开始想选"安装程序光盘映像文件",但那样 VMware 会尝试走"简易安装",自动帮你把分区、用户都配好------对学习没什么好处。所以我选了"稍后安装操作系统",这样能完整走一遍 Anaconda 安装器,看得清楚每一步到底在干什么。
- 磁盘:给了 20 GB,拆分成多个文件。20 GB 对 RHEL 最小安装够用,装图形界面有点紧张,建议 25 GB 往上。
然后是自定义硬件,这块才是真正要上心的地方:
| 硬件 | 我设的值 | 为什么 |
|---|---|---|
| 内存 | 4096 MB | 装图形界面的 RHEL 9,2 GB 会卡到怀疑人生 |
| 网络 | NAT | 开箱即用能上网,不用管宿主机网络怎么配的 |
| CD/DVD | 指向那个 14 GB 的 ISO | 装完记得改成"自动检测",否则每次开机都从光盘引导 |
| 显示器 | 勾选"加速 3D 图形" | 不勾的话 GNOME 界面会难受 |
1.4 装系统
按"开启此虚拟机"之后会进 Anaconda 安装器,流程大概是:
- 引导菜单选第一项,进安装界面
- 语言选中文(简体),键盘布局选 Chinese / English (US)
- 安装目的地:因为整块盘都是虚拟的,直接选"自动"分区就行,不用手动折腾
- 软件选择:默认是"最小安装",我选了"带 GUI 的服务器",不然装完只有黑屏命令行
- 设置 root 密码(一定要记住 ,后面
sudo和很多操作都靠它) - 等十几分钟,重启
重启之后设个普通用户,就进桌面了。
1.5 装完必做的两件事
第一件,装/确认 open-vm-tools。 这个包决定了三件事:分辨率能不能跟着窗口自适应、能不能跟宿主机之间拖拽文件、复制粘贴能不能互通。没有它,虚拟机的分辨率会卡在 800×600,非常难受。
bash
sudo dnf install -y open-vm-tools open-vm-tools-desktop
sudo reboot
第二件,马上拍快照。 虚拟机 → 快照 → 拍摄快照,命名"系统安装完成"。
这一步我是在吃了亏之后才养成习惯的------后面做实验改配置文件,改崩了系统起不来,有快照直接回滚,没快照就得重装。拍快照是虚拟机唯一比真机强的地方,别浪费。

二、内核、Shell、GNU 到底是什么关系
这一节是概念题,但真理解了后面全是加分项。我一开始也是糊的,查了不少资料才捋清楚。
2.1 内核(Kernel)
内核是操作系统里最核心的那个程序,它直接管硬件。
CPU 怎么分配时间片、内存怎么分页、硬盘上的文件怎么组织、网卡收到包给谁------全归它管。
关键点在于权限分层 :内核跑在特权态,可以随便读写硬件;我们平时用的程序(浏览器、编辑器、shell)都跑在用户态,想碰硬件必须通过内核提供的"系统调用"这个接口。这层隔离既是安全机制,也是稳定机制------普通程序崩了不会把整个系统带崩。
Linux 内核是 1991 年 Linus Torvalds 发布的,GPL 协议开源。我们机器上看的版本:
bash
[root@localhost ~]# uname -r
5.14.0-687.5.3.el9_8.x86_64
那个 el9_8 就是 Red Hat Enterprise Linux 9.8 的意思,说明这是红帽在官方内核基础上打补丁后的版本。
2.2 Shell
Shell 是"壳",是内核和用户之间的翻译官。
你敲一行命令,Shell 负责解析它、找到对应的程序、启动它、再把结果展示给你。因为它本质上是个命令解释器,所以 Shell 不止 bash 一种:
| Shell | 说明 |
|---|---|
sh |
最早的 Bourne Shell,几乎所有 Unix 都有 |
bash |
Linux 默认,功能最全,我们在用的就是它 |
zsh |
可定制性极强,macOS 现在默认用它 |
csh / ksh |
语法风格不同,商业 Unix 上见得多 |
想看系统里有哪些 Shell,可以直接读配置文件:
bash
[root@localhost ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
2.3 GNU
这块我一开始最迷糊。GNU 是一个自由软件项目,1983 年由 Richard Stallman 发起,目标很理想主义:做一套完全自由、可以随便用随便改的类 Unix 系统,并且定了 GPL 许可证来保证这种自由能传下去。
GNU 项目写了一大堆东西,比如编译器 gcc、调试器 gdb、我们正在用的 bash,还有 ls、cp、rm、cat 这些天天要用的命令。
但尴尬的是:GNU 缺一个能跑的内核。 他们自己的内核(Hurd)一直没做完。
而 1991 年,Linux 内核出现了------有内核,但缺少外围工具。
于是两边一拍即合。所以严格讲,我们说的"Linux 系统"其实应该叫 GNU/Linux。
在机器上能直接看到这些 GNU 工具:
bash
[root@localhost ~]# ls -l /usr/bin/ls /usr/bin/cp /usr/bin/cat
-rwxr-xr-x. 1 root root 138424 Mar 18 2024 /usr/bin/cat
-rwxr-xr-x. 1 root root 155104 Mar 18 2024 /usr/bin/cp-rwxr-xr-x. 1 root root 141264 Mar 18 2024 /usr/bin/ls
(权限位 -rwxr-xr-x 说明这三个都是可执行程序,属主是 root。)
顺带一提,光 /usr/bin 下面就有 1500 多个可执行文件:
bash
[root@localhost ~]# ls /usr/bin | wc -l
1511
2.4 合起来看
层次大概是这样:
应用层 浏览器、vim、我们写的脚本
↑
Shell 层 bash ------ 命令解释器,人机交互的接口
↑
系统调用/库 glibc 等,给程序提供统一的接口
↑
内核层 Linux 内核 ------ 管进程、内存、文件系统、设备
↑
硬件层 CPU / 内存 / 磁盘 / 网卡
一句话记:内核是心脏,Shell 是外壳,GNU 提供了五脏六腑,三个凑一起才是能用的系统。

三、Shell 怎么启动,提示符在说什么
3.1 怎么进 Shell
平时用得最多的就是图形界面里的终端,Ubuntu 下 Ctrl+Alt+T 就能开。RHEL 里我一般在活动概览里搜 Terminal。
但 Shell 不只这一种进法:
- 虚拟控制台 TTY :
Ctrl+Alt+F1到F6,纯字符界面,没有图形。图形界面卡死的时候,切到 TTY 救急特别好用。 - 远程登录 :
ssh 用户名@IP,服务器场景基本都是这么用的 - 脚本里指定解释器 :脚本第一行的
#!/bin/bash就是在告诉系统用哪个 Shell 跑它 - 手动起子 Shell :直接敲
bash,会开一个新的 Shell,exit退出。判断当前是不是子 Shell,一个技巧是看exit之后有没有回到上一层
3.2 提示符的每一段都有意思
连着敲了几个命令,画面大概长这样:
bash
[root@localhost ~]# echo $PS1
[\u@\h \W]\$
提示符 [root@localhost ~]# 拆开是四段:
| 部分 | 含义 |
|---|---|
root |
当前登录的用户名 |
localhost |
主机名 |
# |
权限标识 :# 是 root,$ 是普通用户 |
最后那个符号一定要盯着看。 它是 root 的话,你随便敲错一条命令,可能就是整个系统起不来了;普通用户的话,最多是操作被拒绝,不会有大事。
目录那一段会跟着 cd 变,这个特别直观:
bash
[root@localhost ~]# cd /etc
[root@localhost etc]# pwd
/etc
[root@localhost etc]# cd ~
[root@localhost ~]# pwd
/root
注意看提示符从 ~ 变成了 etc,再变回来。
至于格式本身,是由环境变量 PS1 控制的,上面 echo $PS1 打出的 [\u@\h \W]\$ 就是它的定义:
| 转义符 | 意思 |
|---|---|
\u |
用户名 |
\h |
主机名(短) |
\H |
主机名(带域名) |
\w |
当前完整路径 |
\W |
只显示最后一级目录名 |
\$ |
权限符号,root 显示 #,普通用户显示 $ |
\t |
24 小时制时间 |
知道这个之后就能自己改了,比如想让提示符带上时间,PS1='[\t \u@\h \W]\$ ' 就行。不过临时改只在当前会话有效,想永久生效得写进 ~/.bashrc。

四、命令是怎么执行的
4.1 基本格式
命令名 [选项] [参数]
- 命令名 :要跑哪个程序,比如
ls - 选项 :控制行为,一般以
-开头。短的可以合并写,ls -la等于ls -l -a;长的用--,比如--help - 参数:操作对象,文件名、目录名之类的
三者之间必须用空格隔开,这个看着像废话,但手快打漏了就是报错。
敲完回车就执行,几个例子:
bash
ls # 单命令
ls -l # 加选项
ls -l /etc/passwd # 选项 + 参数
ls -lh /boot # 两个短选项合并
4.2 敲下去之后发生了什么
- Shell 按空格把这一行拆成命令名和参数
- 拿命令名去
PATH环境变量列出来的那些目录里挨个找 - 找到就 fork 一个子进程跑它,把参数传过去
- 程序把结果输出到终端
- 返回提示符,等你下一条
第 2 步是关键,这解释了为什么有些命令能直接敲,有些必须加路径。看一下 PATH 里到底有哪些目录:
bash
[root@localhost ~]# echo $PATH
/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
which 能看出一个命令最终落在哪:
bash
[root@localhost ~]# which ls
alias ls='ls --color=auto'
/usr/bin/ls
有意思的是它输出两行------因为系统给 ls 设了别名,先解别名再找真身。
type 则能区分一个命令到底是外部程序还是 Shell 自带的:
bash
[root@localhost ~]# type cd
cd is a shell builtin
cd 是内置命令(builtin),因为它要改的是当前 Shell 自己的工作目录,让外部程序来干是没用的------子进程改了目录,退出来就没了。
4.3 几个容易踩的地方
① 严格区分大小写。 ls 能用,LS 就是 command not found。这一点和 Windows 完全不一样,文件名也是。
② 一行可以写多条命令,用分号隔开:
bash
[root@localhost ~]# cd /tmp ; pwd ; cd ~
/tmp
③ 跑当前目录下的程序必须加 ./。 因为系统只在 PATH 列出的目录里找,不会找当前目录(这是出于安全考虑)。
bash
./myscript.sh # 对
myscript.sh # 错:command not found
④ 重定向和管道。 > 是覆盖写入,>> 是追加,| 是把上一条的输出当输入:
bash
ls > list.txt # 覆盖
ls >> list.txt # 追加
ls | wc -l # 数一下有几个文件
这里我踩过一次:想追加结果用了 >,把原文件内容直接冲掉了,而且 Linux 下没有回收站,找不回来 。

五、命令行快捷键
我原来一直是"方向键 + 退格键"硬敲,直到看别人用命令行行云流水,才知道有这些东西。熟练之后效率真的不一样。
5.1 光标和编辑
| 快捷键 | 作用 |
|---|---|
Ctrl+A |
光标跳到行首 |
Ctrl+E |
光标跳到行尾 |
Ctrl+U |
删掉光标前面的所有内容 |
Ctrl+K |
删掉光标后面的所有内容 |
Ctrl+W |
删掉前面一个单词 |
Ctrl+Y |
把刚才删掉的粘回来 |
Ctrl+T |
交换光标处和前一个字符 |
Ctrl+L |
清屏(等于 clear) |
Ctrl+_ |
撤销上一次编辑 |
最有用的场景:命令打了一半发现前缀错了,Ctrl+U 一键清空重来,不用按着退格键等半天。
5.2 控制类
| 快捷键 | 作用 |
|---|---|
Tab |
补齐(下一节细说) |
Ctrl+C |
中断正在跑的命令 |
Ctrl+Z |
把当前命令挂起到后台,fg 恢复 |
Ctrl+D |
结束输入 / 退出当前 Shell |
Ctrl+S / Ctrl+Q |
暂停 / 恢复屏幕输出 |
Ctrl+R |
反向搜索历史命令 |
Ctrl+C 用得太频繁了。比如敲了 ping 忘了加 -c 次数,画面一直刷,或者 cat 后面忘了跟文件名,光标干在那儿等你输入------都是 Ctrl+C 解决。
注意 :终端里 Ctrl+C 是中断,Ctrl+V 是特殊字符输入,所以复制粘贴要用 Ctrl+Shift+C / Ctrl+Shift+V 。这个我刚开始老按错,按了 Ctrl+C 结果啥也没复制,还挺懵。
5.3 从系统里直接看键绑定
stty -a 会打印当前终端驱动的所有特殊字符设置:
bash
[root@localhost ~]# stty -a
speed 38400 baud; rows 26; columns 127; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
...
几个重点:
intr = ^C------ 中断键就是 Ctrl+Ceof = ^D------ Ctrl+D 表示输入结束kill = ^U------ Ctrl+U 一次删到行首erase = ^?------ 退格键
readline 层面的绑定可以用 bind -P 看:
bash
[root@localhost ~]# bind -P | grep -E 'beginning-of-line|end-of-line|unix-line-discard|clear-screen' | sort
beginning-of-line can be found on "\C-a".
clear-screen can be found on "\C-l".
end-of-line can be found on "\C-e".
unix-line-discard can be found on "\C-u".
这比背表格可靠------想知道某个键到底绑了什么功能,查自己机器最准。
5.4 实测一下 Ctrl+C
敲个会长期阻塞的命令,然后按 Ctrl+C:
bash
[root@localhost ~]# echo '=== Ctrl+C : interrupt a running command ==='
=== Ctrl+C : interrupt a running command ===
[root@localhost ~]# sleep 300
^C
[root@localhost ~]# echo 'interrupted - back to the prompt'
interrupted - back to the prompt
注意 sleep 300 那行下面的 ^C,那是终端把中断信号回显出来了,然后立刻回到提示符。
Ctrl+A / Ctrl+E 的效果也可以这样验证:先敲 ls -l /etc/hosts,按 Ctrl+A 把光标移到行首,再输入 echo ,这行就变成了:
bash
[root@localhost ~]# echo ls -l /etc/hosts
ls -l /etc/hosts
echo 出现在了你原本输入内容的前面,说明光标确实跳到了行首。



六、历史命令
Shell 会自动记下你敲过的命令,家目录下的 .bash_history 就是干这个的(当前会话的先在内存里,退出时才写文件)。我用得最多的功能之一。
6.1 查看和管理
bash
history # 列出全部历史,带编号
history 10 # 最近 10 条
history -c # 清空当前会话的历史
history -w # 把当前历史写进 .bash_history
数量受两个环境变量控制:
HISTSIZE------ 内存里保留多少条HISTFILESIZE------ 文件里保存多少条
一个小提醒 :如果命令里带密码(比如 mysql -p密码),可以在命令前面加一个空格 再敲,前提是 HISTCONTROL 里有 ignorespace,这样它不会进历史记录。
6.2 怎么调用
| 写法 | 作用 |
|---|---|
↑ / ↓ |
上下翻 |
!! |
重跑上一条 |
!n |
跑历史里编号 n 的那条 |
!-n |
跑倒数第 n 条 |
!字符串 |
跑最近一条以该字符串开头的 |
!$ |
取上一条命令的最后一个参数 |
^旧^新 |
把上一条里的旧字符串换成新的再跑 |
Ctrl+R |
反向搜索(最好用) |
实测几条:
bash
[root@localhost ~]# echo '### 1) history lists the commands you typed'
### 1) history lists the commands you typed
[root@localhost ~]# history | tail -9
...
[root@localhost ~]# echo '### 2) !-2 re-runs the command two steps back'
### 2) !-2 re-runs the command two steps back[root@localhost ~]# history | tail -9
...
注意看:敲 !-2 之后,Shell 把要执行的完整命令回显了出来(history | tail -9),然后再跑。这个回显特别有用,能让你确认自己到底调用了哪条,别稀里糊涂跑了一条危险的命令。
!$ 也值得单独说。比如:
bash
ls -l /etc/passwd
vim !$ # 等价于 vim /etc/passwd
省得再敲一遍长路径。
6.3 Ctrl+R:真正改变体验的功能
按 Ctrl+R 之后提示符会变成这样:
(reverse-i-search)`uname': uname -r
此时你输入关键字,Shell 会实时匹配最近一条包含该关键字的命令,再按 Ctrl+R 继续往前找更早的匹配。
找到目标后:
- 按
→或Esc把命令放到命令行上编辑 - 直接回车执行
Ctrl+G取消搜索
以前我都是按几十下上箭头找一条命令,学会 Ctrl+R 之后基本没再这么干过。

七、Tab 补齐
这个功能用顺手之后会上瘾,而且它还有个副作用------大幅减少拼写错误。
7.1 能补什么
| 场景 | 例子 | 结果 |
|---|---|---|
| 命令名 | 敲 mkdi 按 Tab |
补成 mkdir |
| 路径 | 敲 cat /etc/hostn 按 Tab |
补成 cat /etc/hostname |
| 文件名 | 敲 ls rep 按 Tab |
补成 ls report_202 |
| 变量 | 敲 echo $HO 按 Tab |
补成 $HOME |
| 用户名 | 敲 cd ~ma 按 Tab |
补成对应用户家目录 |
| 命令选项 | 敲 ls --co 按 Tab |
补成 --color(要装 bash-completion) |
7.2 两种行为
唯一匹配:直接补全,不提示。
多个匹配 :第一次按 Tab 先补到公共前缀,再按一次才把所有候选列出来。实测:
bash
[root@localhost lab]# ls report
report_2024.txt report_2025.txt report_2026.txt[root@localhost lab]# ls report_202
我一开始按一次没反应,以为是卡了,其实是只按一次默认不列候选。按两次就出来了,上面的候选列表就是这么来的。
(如果你希望按一次就列出来,可以在 ~/.inputrc 里加上 set show-all-if-ambiguous on。)
7.3 注意点
- 区分大小写 ,
Report补不到report_2024.txt - 候选太多时会问
Display all 123 possibilities? (y or n),按y才显示 - 想让命令的选项 也能智能补齐,得装
bash-completion:
bash
sudo dnf install -y bash-completion

八、忘了命令怎么办:三种查法
命令太多,记不住是正常的。关键是知道去哪儿查,而不是硬背。
8.1 whatis ------ 先知道它是干嘛的
bash
[root@localhost ~]# whatis ls
ls (1) - list directory contents
[root@localhost ~]# whatis passwd
passwd (1) - update a user's authentication tokens(s)
passwd (5) - password file
一句话说明。注意 passwd 出来两行------同一个名字在不同手册章节 里是两个东西:(1) 是说 passwd 这个命令 ,(5) 是说 /etc/passwd 这个文件格式。
如果提示 nothing appropriate,说明手册数据库没建,跑一下 mandb 就好。
8.2 --help ------ 快速看用法
几乎所有 GNU 命令都支持:
bash
[root@localhost ~]# ls --help | head -14
Usage: ls [OPTION]... [FILE]...
List information about the FILEs (the current directory by default).Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.
...
优点是不翻页、直接打印,扫一眼就够了。输出里几个符号的意思:
| 符号 | 含义 |
|---|---|
[] |
方括号里的是可选的 |
... |
可以重复多次 |
-a, --all |
短选项和长选项的对应写法 |
| 大写字母 | 占位符,要换成实际的值 |
8.3 man ------ 最权威
要看完整文档就 man:
bash
man ls
会进入一个分页界面(其实底层就是 less),常用操作:
| 按键 | 作用 |
|---|---|
↑ ↓ 或 j k |
上下滚 |
空格 / b |
下翻一页 / 上翻一页 |
/关键字 |
往下搜 |
n / N |
下一个 / 上一个匹配 |
g / G |
跳到开头 / 结尾 |
q |
退出手册 |
q 是新手最容易卡住的地方 ------我一开始翻到一半不知道咋退,只能 Ctrl+C。其实按 q 就干净退出了。
8.4 手册的 9 个章节
man 手册分 9 个章节,知道这个才能在重名的时候查对地方:
| 章节 | 内容 |
|---|---|
| 1 | 用户命令 |
| 2 | 系统调用 |
| 3 | 库函数 |
| 4 | 特殊文件(/dev 下的设备) |
| 5 | 文件格式(如 /etc/passwd) |
| 6 | 游戏 |
| 7 | 杂项 |
| 8 | 系统管理命令 |
| 9 | 内核例程 |
所以查 /etc/passwd 这个文件的格式,要写 man 5 passwd;不加章节号的话,默认从第 1 章开始找,会给你命令的说明。
8.5 其他顺手的方法
| 命令 | 用途 |
|---|---|
man -k 关键字 |
按功能描述搜(等于 apropos),忘命令名时好用 |
info 命令 |
GNU 官方超文本文档,比 man 更详细 |
命令 --version |
看版本 |
type / which / whereis |
看这命令是什么、在哪 |
help 内置命令 |
查 bash 自己的内置命令,比如 help cd |
我平时的顺序是:先 whatis 扫一眼它是啥 → 不确定选项就 --help → 要详细就 man 。



九、文件管理:增删复制
这块是实操重点,我把新建、删除、复制都过了一遍。先建个工作目录:
bash
[root@localhost ~]# mkdir -p /root/lab
[root@localhost ~]# cd /root/lab
[root@localhost lab]# pwd
/root/lab
9.1 新建文件
| 方法 | 命令 |
|---|---|
| 建空文件 | touch file1.txt |
| 带内容 | echo "Hello Linux" > hello.txt |
| 进编辑器 | vim b.txt / nano b.txt |
| 键盘输入 | cat > c.txt,输完按 Ctrl+D |
touch 是最常用的。它有个细节:文件已存在时不报错,只更新一下时间戳。
bash
[root@localhost lab]# touch file1.txt
[root@localhost lab]# ls -l
total 0
-rw-r--r--. 1 root root 0 Oct 9 06:49 file1.txt
9.2 新建目录
bash
[root@localhost lab]# mkdir dir1
[root@localhost lab]# ls -l
total 0
drwxr-xr-x. 2 root root 6 Oct 9 06:49 dir1
-rw-r--r--. 1 root root 0 Oct 9 06:49 file1.txt
注意 dir1 那一行的第一个字符是 d,表示它是目录;file1.txt 是 -,表示普通文件。
-p 这个选项一定要会。想一次建多级目录:
bash
mkdir -p a/b/c # 对
mkdir a/b/c # 错:no such file or directory
不加 -p 时父目录必须已经存在,否则报错。另外 -p 还有个好处:目录已存在时不报错。
9.3 删除文件
bash
rm file1.txt # 删单个
rm a.txt b.txt # 删多个
rm -i hello.txt # 删前询问(更安全)
rm -f hello.txt # 强制删,不询问
rm *.tmp # 通配符批量删
这里必须重点强调:Linux 的 rm 不进回收站。
删了就真没了,没有任何恢复手段(除非你有备份或者用专业数据恢复工具)。我现在的习惯是给 rm 加个别名,让它每次问一下:
bash
alias rm='rm -i'
写进 ~/.bashrc 就永久生效。
9.4 删除目录
两个命令,分工不同:
bash
rmdir dir1 # 只能删【空目录】
rm -r dir1 # 递归删,目录和里面的内容一起
rm -rf dir1 # 递归 + 强制,不询问
rmdir 遇到非空目录会直接报错:
bash
[root@localhost lab]# rmdir dir1
rmdir: failed to remove 'dir1': Directory not empty
这个报错其实是安全设计 ------它在提醒你"这里还有东西,确定要删吗"。确认要删就换 rm -r。
⚠️ rm -rf 的危险程度怎么强调都不过分。 尤其注意这几种写法:
bash
rm -rf / # 直接摧毁系统
rm -rf /* # 同上
rm -rf $VAR/ # 如果变量是空的,就变成 rm -rf / 了
最后一条最阴险。所以在脚本里用变量做删除路径时,一定要先判断变量非空。
9.5 复制文件
bash
cp hello.txt hello_bak.txt # 复制并改名
cp hello.txt /tmp/ # 复制到目录
cp -i a.txt b.txt # 覆盖前询问
cp -p a.txt b.txt # 保留权限、属主、时间戳
cp -a src dst # 归档模式,保留全部属性(备份首选)cp -b a.txt b.txt # 覆盖前先备份原文件
常用选项:
| 选项 | 作用 |
|---|---|
-i |
覆盖前询问 |
-f |
强制覆盖 |
-r / -R |
递归(复制目录必须加) |
-p |
保留权限、属主、时间戳 |
-a |
归档模式,等于 -dpr 打包 |
-v |
显示复制过程 |
-b |
覆盖前备份 |
9.6 复制目录
复制目录必须加 -r,这是初学者最容易漏的。不加的话:
bash
[root@localhost lab]# cp dir1 dir2
cp: -r not specified; omitting directory 'dir1'
加上就正常了:
bash
[root@localhost lab]# cp -r dir1 dir1_bak
[root@localhost lab]# ls -l
做备份的话我更推荐 cp -a,因为它会把原文件的权限、属主、时间戳全保留下来。用普通 cp 复制,属主可能变成当前用户、时间戳变成现在------有时候这会影响程序运行。
还有个小坑:如果目标目录已经存在 ,cp -r dir1 dir2 的行为是把它复制成 dir2/dir1,而不是覆盖 dir2。这个和很多人的直觉不一样。
9.7 通配符
配合文件管理用,效率翻倍:
| 通配符 | 含义 | 例子 |
|---|---|---|
* |
任意多个字符 | rm *.log |
? |
恰好一个字符 | ls file?.txt |
[abc] |
括号内任一字符 | ls file[123].txt |
[a-z] |
范围内任一字符 | ls file[a-z].txt |
{a,b} |
花括号扩展 | touch {a,b,c}.txt 生成三个文件 |


十、最后总结几个坑
这轮实操下来,我记下这几条:
1. rm 没有回收站。 这是和 Windows 最大的思维差异。删除前多看一眼,给 rm 加 -i 别名。
2. 复制目录必须 -r。 忘了就报错,不复杂但很常犯。
3. 看到 # 提示符要紧张起来。 那意味着你是 root,一条错命令可能让系统起不来。在虚拟机里练,并且提前拍快照,是唯一安全的学习方式。
4. 别背命令,学会查。 whatis 扫一眼 → --help 看用法 → man 看细节,配合 Tab 补齐和 Ctrl+R 搜历史,效率比死记硬背高太多。
5. 虚拟机的快照是真香。 做实验前拍一个,改崩了 10 秒回滚,比重装系统快无数倍。
参考
- 《鸟哥的 Linux 私房菜(基础学习篇)》
- Red Hat Enterprise Linux 9 官方文档
- GNU 项目官网 https://www.gnu.org/
- man 手册(系统自带,
man man)
本文是课程作业整理,环境为 VMware Workstation 17.6.4 + RHEL 9.8,文中的命令和输出均来自实际运行结果。有写得不对的地方欢迎指正。