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,非常难受。
sudodnfinstall-yopen-vm-tools open-vm-tools-desktopsudoreboot第二件,马上拍快照。虚拟机 → 快照 → 拍摄快照,命名"系统安装完成"。
这一步我是在吃了亏之后才养成习惯的——后面做实验改配置文件,改崩了系统起不来,有快照直接回滚,没快照就得重装。拍快照是虚拟机唯一比真机强的地方,别浪费。
二、内核、Shell、GNU 到底是什么关系
这一节是概念题,但真理解了后面全是加分项。我一开始也是糊的,查了不少资料才捋清楚。
2.1 内核(Kernel)
内核是操作系统里最核心的那个程序,它直接管硬件。
CPU 怎么分配时间片、内存怎么分页、硬盘上的文件怎么组织、网卡收到包给谁——全归它管。
关键点在于权限分层:内核跑在特权态,可以随便读写硬件;我们平时用的程序(浏览器、编辑器、shell)都跑在用户态,想碰硬件必须通过内核提供的"系统调用"这个接口。这层隔离既是安全机制,也是稳定机制——普通程序崩了不会把整个系统带崩。
Linux 内核是 1991 年 Linus Torvalds 发布的,GPL 协议开源。我们机器上看的版本:
[root@localhost ~]# uname -r5.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,可以直接读配置文件:
[root@localhost ~]# cat /etc/shells/bin/sh /bin/bash /usr/bin/sh /usr/bin/bash2.3 GNU
这块我一开始最迷糊。GNU 是一个自由软件项目,1983 年由 Richard Stallman 发起,目标很理想主义:做一套完全自由、可以随便用随便改的类 Unix 系统,并且定了 GPL 许可证来保证这种自由能传下去。
GNU 项目写了一大堆东西,比如编译器gcc、调试器gdb、我们正在用的bash,还有ls、cp、rm、cat这些天天要用的命令。
但尴尬的是:GNU 缺一个能跑的内核。他们自己的内核(Hurd)一直没做完。
而 1991 年,Linux 内核出现了——有内核,但缺少外围工具。
于是两边一拍即合。所以严格讲,我们说的"Linux 系统"其实应该叫GNU/Linux。
在机器上能直接看到这些 GNU 工具:
[root@localhost ~]# ls -l /usr/bin/ls /usr/bin/cp /usr/bin/cat-rwxr-xr-x.1root root138424Mar182024/usr/bin/cat -rwxr-xr-x.1root root155104Mar182024/usr/bin/cp-rwxr-xr-x.1root root141264Mar182024/usr/bin/ls(权限位-rwxr-xr-x说明这三个都是可执行程序,属主是 root。)
顺带一提,光/usr/bin下面就有 1500 多个可执行文件:
[root@localhost ~]# ls /usr/bin | wc -l15112.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 提示符的每一段都有意思
连着敲了几个命令,画面大概长这样:
[root@localhost ~]# echo $PS1[\u@\h\W]\$提示符[root@localhost ~]#拆开是四段:
| 部分 | 含义 |
|---|---|
root | 当前登录的用户名 |
localhost | 主机名 |
# | 权限标识:#是 root,$是普通用户 |
最后那个符号一定要盯着看。它是 root 的话,你随便敲错一条命令,可能就是整个系统起不来了;普通用户的话,最多是操作被拒绝,不会有大事。
目录那一段会跟着cd变,这个特别直观:
[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 - 参数:操作对象,文件名、目录名之类的
三者之间必须用空格隔开,这个看着像废话,但手快打漏了就是报错。
敲完回车就执行,几个例子:
ls# 单命令ls-l# 加选项ls-l/etc/passwd# 选项 + 参数ls-lh/boot# 两个短选项合并4.2 敲下去之后发生了什么
- Shell 按空格把这一行拆成命令名和参数
- 拿命令名去
PATH环境变量列出来的那些目录里挨个找 - 找到就 fork 一个子进程跑它,把参数传过去
- 程序把结果输出到终端
- 返回提示符,等你下一条
第 2 步是关键,这解释了为什么有些命令能直接敲,有些必须加路径。看一下 PATH 里到底有哪些目录:
[root@localhost ~]# echo $PATH/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/binwhich能看出一个命令最终落在哪:
[root@localhost ~]# which lsaliasls='ls --color=auto'/usr/bin/ls有意思的是它输出两行——因为系统给ls设了别名,先解别名再找真身。
type则能区分一个命令到底是外部程序还是 Shell 自带的:
[root@localhost ~]# type cdcdis a shellbuiltincd是内置命令(builtin),因为它要改的是当前 Shell 自己的工作目录,让外部程序来干是没用的——子进程改了目录,退出来就没了。
4.3 几个容易踩的地方
① 严格区分大小写。ls能用,LS就是command not found。这一点和 Windows 完全不一样,文件名也是。
② 一行可以写多条命令,用分号隔开:
[root@localhost ~]# cd /tmp ; pwd ; cd ~/tmp③ 跑当前目录下的程序必须加./。因为系统只在 PATH 列出的目录里找,不会找当前目录(这是出于安全考虑)。
./myscript.sh# 对myscript.sh# 错:command not found④ 重定向和管道。>是覆盖写入,>>是追加,|是把上一条的输出当输入:
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会打印当前终端驱动的所有特殊字符设置:
[root@localhost ~]# stty -aspeed38400baud;rows26;columns127;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看:
[root@localhost ~]# bind -P | grep -E 'beginning-of-line|end-of-line|unix-line-discard|clear-screen' | sortbeginning-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:
[root@localhost ~]# echo '=== Ctrl+C : interrupt a running command ==='===Ctrl+C:interrupt a runningcommand===[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,这行就变成了:
[root@localhost ~]# echo ls -l /etc/hostsls-l/etc/hostsecho出现在了你原本输入内容的前面,说明光标确实跳到了行首。
六、历史命令
Shell 会自动记下你敲过的命令,家目录下的.bash_history就是干这个的(当前会话的先在内存里,退出时才写文件)。我用得最多的功能之一。
6.1 查看和管理
history# 列出全部历史,带编号history10# 最近 10 条history-c# 清空当前会话的历史history-w# 把当前历史写进 .bash_history数量受两个环境变量控制:
HISTSIZE—— 内存里保留多少条HISTFILESIZE—— 文件里保存多少条
一个小提醒:如果命令里带密码(比如mysql -p密码),可以在命令前面加一个空格再敲,前提是HISTCONTROL里有ignorespace,这样它不会进历史记录。
6.2 怎么调用
| 写法 | 作用 |
|---|---|
↑/↓ | 上下翻 |
!! | 重跑上一条 |
!n | 跑历史里编号 n的那条 |
!-n | 跑倒数第 n 条 |
!字符串 | 跑最近一条以该字符串开头的 |
!$ | 取上一条命令的最后一个参数 |
^旧^新 | 把上一条里的旧字符串换成新的再跑 |
Ctrl+R | 反向搜索(最好用) |
实测几条:
[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),然后再跑。这个回显特别有用,能让你确认自己到底调用了哪条,别稀里糊涂跑了一条危险的命令。
!$也值得单独说。比如:
ls-l/etc/passwdvim!$# 等价于 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 先补到公共前缀,再按一次才把所有候选列出来。实测:
[root@localhost lab]# ls reportreport_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:
sudodnfinstall-ybash-completion八、忘了命令怎么办:三种查法
命令太多,记不住是正常的。关键是知道去哪儿查,而不是硬背。
8.1 whatis —— 先知道它是干嘛的
[root@localhost ~]# whatis lsls(1)- list directory contents[root@localhost ~]# whatis passwdpasswd(1)- update a user's authentication tokens(s)passwd(5)- passwordfile一句话说明。注意passwd出来两行——同一个名字在不同手册章节里是两个东西:(1)是说passwd这个命令,(5)是说/etc/passwd这个文件格式。
如果提示nothing appropriate,说明手册数据库没建,跑一下mandb就好。
8.2 --help —— 快速看用法
几乎所有 GNU 命令都支持:
[root@localhost ~]# ls --help | head -14Usage:ls[OPTION]...[FILE]... List information about the FILEs(the current directory by default).Sort entries alphabeticallyifnone of-cftuvSUXnor--sortis specified....优点是不翻页、直接打印,扫一眼就够了。输出里几个符号的意思:
| 符号 | 含义 |
|---|---|
[] | 方括号里的是可选的 |
... | 可以重复多次 |
-a, --all | 短选项和长选项的对应写法 |
| 大写字母 | 占位符,要换成实际的值 |
8.3 man —— 最权威
要看完整文档就man:
manls会进入一个分页界面(其实底层就是less),常用操作:
| 按键 | 作用 |
|---|---|
↑↓或jk | 上下滚 |
空格/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。
九、文件管理:增删复制
这块是实操重点,我把新建、删除、复制都过了一遍。先建个工作目录:
[root@localhost ~]# mkdir -p /root/lab[root@localhost ~]# cd /root/lab[root@localhost lab]# pwd/root/lab9.1 新建文件
| 方法 | 命令 |
|---|---|
| 建空文件 | touch file1.txt |
| 带内容 | echo "Hello Linux" > hello.txt |
| 进编辑器 | vim b.txt/nano b.txt |
| 键盘输入 | cat > c.txt,输完按Ctrl+D |
touch是最常用的。它有个细节:文件已存在时不报错,只更新一下时间戳。
[root@localhost lab]# touch file1.txt[root@localhost lab]# ls -ltotal0-rw-r--r--.1root root0Oct906:49 file1.txt9.2 新建目录
[root@localhost lab]# mkdir dir1[root@localhost lab]# ls -ltotal0drwxr-xr-x.2root root6Oct906:49 dir1 -rw-r--r--.1root root0Oct906:49 file1.txt注意dir1那一行的第一个字符是d,表示它是目录;file1.txt是-,表示普通文件。
-p这个选项一定要会。想一次建多级目录:
mkdir-pa/b/c# 对mkdira/b/c# 错:no such file or directory不加-p时父目录必须已经存在,否则报错。另外-p还有个好处:目录已存在时不报错。
9.3 删除文件
rmfile1.txt# 删单个rma.txt b.txt# 删多个rm-ihello.txt# 删前询问(更安全)rm-fhello.txt# 强制删,不询问rm*.tmp# 通配符批量删这里必须重点强调:Linux 的rm不进回收站。
删了就真没了,没有任何恢复手段(除非你有备份或者用专业数据恢复工具)。我现在的习惯是给rm加个别名,让它每次问一下:
aliasrm='rm -i'写进~/.bashrc就永久生效。
9.4 删除目录
两个命令,分工不同:
rmdirdir1# 只能删【空目录】rm-rdir1# 递归删,目录和里面的内容一起rm-rfdir1# 递归 + 强制,不询问rmdir遇到非空目录会直接报错:
[root@localhost lab]# rmdir dir1rmdir: failed to remove'dir1':Directory not empty这个报错其实是安全设计——它在提醒你"这里还有东西,确定要删吗"。确认要删就换rm -r。
⚠️rm -rf的危险程度怎么强调都不过分。尤其注意这几种写法:
rm-rf/# 直接摧毁系统rm-rf/*# 同上rm-rf$VAR/# 如果变量是空的,就变成 rm -rf / 了最后一条最阴险。所以在脚本里用变量做删除路径时,一定要先判断变量非空。
9.5 复制文件
cphello.txt hello_bak.txt# 复制并改名cphello.txt /tmp/# 复制到目录cp-ia.txt b.txt# 覆盖前询问cp-pa.txt b.txt# 保留权限、属主、时间戳cp-asrc dst# 归档模式,保留全部属性(备份首选)cp -b a.txt b.txt # 覆盖前先备份原文件常用选项:
| 选项 | 作用 |
|---|---|
-i | 覆盖前询问 |
-f | 强制覆盖 |
-r/-R | 递归(复制目录必须加) |
-p | 保留权限、属主、时间戳 |
-a | 归档模式,等于-dpr打包 |
-v | 显示复制过程 |
-b | 覆盖前备份 |
9.6 复制目录
复制目录必须加-r,这是初学者最容易漏的。不加的话:
[root@localhost lab]# cp dir1 dir2cp:-rnot specified;omitting directory'dir1'加上就正常了:
[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,文中的命令和输出均来自实际运行结果。有写得不对的地方欢迎指正。