Linux 命令行入门踩坑记录:从 VMware 装系统到文件管理

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

这一步基本无脑点下一步,只有两个地方值得留意:

  1. 安装路径建议改到 D 盘(或者空间大的盘)。VMware 本体不大,但虚拟机磁盘文件会越滚越大,跟系统盘挤在一起以后会很痛苦。
  2. 勾选"增强型键盘驱动程序",不然后面在虚拟机里按快捷键容易失灵。

装完需要重启一次,重启后系统里会多出几项 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 安装器,流程大概是:

  1. 引导菜单选第一项,进安装界面
  2. 语言选中文(简体),键盘布局选 Chinese / English (US)
  3. 安装目的地:因为整块盘都是虚拟的,直接选"自动"分区就行,不用手动折腾
  4. 软件选择:默认是"最小安装",我选了"带 GUI 的服务器",不然装完只有黑屏命令行
  5. 设置 root 密码(一定要记住 ,后面 sudo 和很多操作都靠它)
  6. 等十几分钟,重启

重启之后设个普通用户,就进桌面了。

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 敲下去之后发生了什么

  1. Shell 按空格把这一行拆成命令名和参数
  2. 拿命令名去 PATH 环境变量列出来的那些目录里挨个找
  3. 找到就 fork 一个子进程跑它,把参数传过去
  4. 程序把结果输出到终端
  5. 返回提示符,等你下一条

第 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+C
  • eof = ^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 秒回滚,比重装系统快无数倍。


参考

  1. 《鸟哥的 Linux 私房菜(基础学习篇)》
  2. Red Hat Enterprise Linux 9 官方文档
  3. GNU 项目官网 https://www.gnu.org/
  4. man 手册(系统自带,man man)

本文是课程作业整理,环境为 VMware Workstation 17.6.4 + RHEL 9.8,文中的命令和输出均来自实际运行结果。有写得不对的地方欢迎指正。

相关推荐
飞飞传输1 小时前
业务系统文件安全检测怎么做?生物医药企业选型与建设指南
大数据·运维·安全
姜鱼问生1 小时前
docker exec 排查容器问题:从日志到进程
运维·网络·数据库·docker·容器
qq_543447821 小时前
DNS解析怎么排查?故障处理与运维实用手册
运维·服务器·网络·php
DeviceHub1 小时前
AI服务器电源设计进阶:TLVR电感的应用解析与选型验证指南
运维·服务器·人工智能
Apipi*1 小时前
30天速通Linux 第七章进程间通信
linux·运维·服务器
emo_2b1 小时前
Pycharm配置conda解释器时遇到的问题及解决方法
linux·pycharm·conda
迪康软件zz1 小时前
终端审批体系怎么搭?从模板配置到业务连续性
运维·安全·自动化运维
科技研学社2 小时前
中小服装工装厂自动化改造:产线节拍平衡与工位减负实施方案
运维·自动化
极光通讯2 小时前
服务器内存替代料选型方法论:主料号缺货时如何找到Pin-to-Pin兼容型号
运维·服务器