/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */
#content_views .toc,
/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */
#content_views.markdown_views > p:empty:has(+ .toc),
#content_views.markdown_views > .toc + p:empty,
/* 富文本旧版目录标记 */
#content_views.htmledit_views #main-toc,
#content_views.htmledit_views #hr-toc,
#content_views.htmledit_views p[id*=\”-toc\”] {
display: none !important;
}
/* 目录去掉后,紧跟的首个标题不再多出一块上边距 */
#content_views.markdown_views > .toc + h1,
#content_views.markdown_views > .toc + h2,
#content_views.markdown_views > .toc + h3,
#content_views.markdown_views > .toc + h4,
#content_views.markdown_views > .toc + p:empty + h1,
#content_views.markdown_views > .toc + p:empty + h2,
#content_views.markdown_views > .toc + p:empty + h3,
#content_views.markdown_views > .toc + p:empty + h4 {
margin-top: 0 !important;
}
🎬 博主名称:一鸣
🔥 个人专栏: 《苍穹外卖》《喜喜》
⛺️生活的理想,就是为了理想的生活!
文章目录
-
- 前言:这篇实操笔记的由来
- 一、文件操作九连:openEuler 常用命令实战
-
- 1.1 cd + pwd + find:切换目录、确认位置、按类型查找
- 1.2 touch + ls -l:创建空文件并长格式查看
- 1.3 touch -t / -r:时间戳的修改与同步
- 1.4 mv:重命名与移动,一个命令两件事
- 1.5 mkdir -p + cp -r:递归复制整个目录
- 1.6 rm -rf:无确认删除(高危命令,重点看提示)
- 1.7 head + tail:只看文件头尾,不翻全文
- 1.8 find + 通配符:按命名模式全盘查找
- 1.9 ln -s:给文件建一个"快捷方式"
- 二、vi 编辑器十连:从入门到进阶
-
- 2.0 先搞懂:vi 的三种工作模式(不懂这个,vi 就是迷宫)
- 2.1 创建文件并写入内容:vi + i + :wq
- 2.2 追加多行内容:重新打开继续编辑
- 2.3 显示行号:set nu(高频使用,建议背下来)
- 2.4 读取外部文件插入当前文件:r 命令
- 2.5 复制粘贴:nyy + p 的标准姿势
- 2.6 查找字符串:/关键词
- 2.7 全局替换:s/旧/新/g
- 2.8 删除行与删除字符:dd 和 x
- 2.9 把指定行写入新文件:w 命令的花式用法
- 2.10 保存退出,终验成果
- 三、核心概念速答:考试和面试都爱问
-
- 3.1 openEuler 常见的文件类型
- 3.2 硬链接 vs 软链接(高频考点)
- 3.3 vi 三种工作模式
- 3.4 保存与退出命令
- 四、不止会敲命令:这次实验里藏着运维的"职业规范"
- 五、命令速查表(建议收藏)
-
- 文件操作
- vi 编辑器
- 写在最后
刚装好 openEuler,面对黑漆漆的终端不知道从哪下手?文件操作命令一用就忘、vi 一进去就退不出来?这篇文章用 19 个完整实操案例,带你把 openEuler 最常用的文件命令和 vi 编辑器一次练透。每一步都给出完整命令 + 终端输出实录,命令可以直接复制、输出可以对照验证,跟着敲一遍,比看十篇纯理论都管用。建议先收藏,跟着敲。
前言:这篇实操笔记的由来
最近在 openEuler 课程里完成了「常用命令 + vi 编辑器」的综合实验。做的时候我发现一个普遍问题:命令单个都认识,连起来就懵——cp 和 mv 什么时候该用哪个?touch 除了建空文件还能干什么?vi 里怎么把别人的文件"抄"进来?
于是我把整个实验的 19 个操作整理成这篇笔记,每个操作都包含三样东西:任务目标、完整命令、终端输出实录,中间穿插踩过的坑。你可以把它当成一份"能照着敲"的实操手册。
环境信息(版本信息很重要,照做之前先核对,避免结果对不上):
| 操作系统 | openEuler(DDE 桌面环境) |
| 用户 | root |
| Shell | bash |
| 编辑器 | vi |
| 主机名 | lym(已按要求提前修改) |
⚠️ 实验前的关键准备:修改主机名,让终端提示符带上自己的标识,后续所有输出都能确认"我在哪台机器上"。
[root@lym ~]# hostnamectl set-hostname lym
执行后关闭终端重新打开才会生效,新提示符会变成 [root@lym ~]#。
一、文件操作九连:openEuler 常用命令实战
1.1 cd + pwd + find:切换目录、确认位置、按类型查找
目标:进入 /boot/grub2,确认当前路径,再找出 /boot 下所有目录类型的文件。
[root@lym ~]# cd /boot/grub2
[root@lym grub2]# pwd
/boot/grub2
[root@lym grub2]# find /boot -type d
/boot
/boot/grub2
/boot/grub2/i386-pc
/boot/grub2/locale
/boot/grub2/fonts
/boot/loader/entries
命令拆解:
- cd 切换目录,cd .. 回上级,cd ~ 回家目录,cd – 回上一次目录;
- pwd 是 print working directory,每换一个目录都先 pwd 确认一下,是好习惯;
- find 的 -type 参数按类型过滤:d 目录、f 普通文件、l 链接文件。
💡 避坑提示:终端不会帮你自动纠错——如果你把 pwd 手滑敲成 pwe,bash 会直接报 bash: pwe: command not found。回车之前多看一眼,能省掉很多莫名其妙的报错。
1.2 touch + ls -l:创建空文件并长格式查看
目标:创建 file1.txt、file2.txt 两个空文件,用长格式查看属性。
[root@lym grub2]# touch file1.txt file2.txt
[root@lym grub2]# ls -l file1.txt file2.txt
-rw-r–r–. 1 root root 0 11月 6 22:00 file1.txt
-rw-r–r–. 1 root root 0 11月 6 22:00 file2.txt
命令拆解:ls -l 输出的七列依次是:权限、链接数、属主、属组、大小、修改时间、文件名。看懂这一行,后面所有文件操作都有据可查。
1.3 touch -t / -r:时间戳的修改与同步
目标:把 file1.txt 的时间戳改成 2019-12-25 15:30,再让 file2.txt 与它保持一致。
[root@lym grub2]# touch -t 201912251530 file1.txt
[root@lym grub2]# touch -r file1.txt file2.txt
[root@lym grub2]# ls -l file1.txt file2.txt
-rw-r–r–. 1 root root 0 12月 25 2019 file1.txt
-rw-r–r–. 1 root root 0 12月 25 2019 file2.txt
命令拆解:touch 远不止"创建空文件"——-t 指定时间(年月日时分共 12 位,格式 CCYYMMDDhhmm),-r 以指定文件为参照同步时间。做日志归档、构造测试数据时非常好用。
1.4 mv:重命名与移动,一个命令两件事
目标:把 file2.txt 重命名为 file3.txt,再移动到 /home 目录下。
[root@lym grub2]# mv file2.txt file3.txt
[root@lym grub2]# mv file3.txt /home/
[root@lym grub2]# ls -l /home/file3.txt
-rw-r–r–. 1 root root 0 12月 25 2019 /home/file3.txt
命令拆解:mv 的逻辑很简单——目标路径里文件名变了就是重命名,没变就是移动。Linux 没有专门的"重命名"命令,mv 就是。
1.5 mkdir -p + cp -r:递归复制整个目录
目标:把 /etc/selinux 里的所有内容复制到 /home/test23(23 是我学号后两位)。
[root@lym grub2]# mkdir -p /home/test23
[root@lym grub2]# cp -r /etc/selinux/ /home/test23/
[root@lym grub2]# ls /home/test23
selinux
💡 避坑提示:cp 复制目录时如果不加 -r,会直接报错 omitting directory。记住口诀:复制目录,必带 -r。
1.6 rm -rf:无确认删除(高危命令,重点看提示)
目标:删除 /home/test23 下的所有内容,系统不逐一询问直接删。
[root@lym grub2]# ls /home/test23 # 删之前先核对里面有什么
selinux
[root@lym grub2]# rm -rf /home/test23
[root@lym grub2]# ls /home # 确认已删除
file3.txt
⚠️ 高危命令警示(必读):rm -rf 删除后基本无法恢复,生产环境手滑 rm -rf / 的事故每年都在发生。我的操作习惯是:
命令可以快,路径必须对。
1.7 head + tail:只看文件头尾,不翻全文
目标:查看 /etc/passwd 的头 10 行、/etc/shadow 的尾 5 行。
[root@lym grub2]# head -10 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
[root@lym grub2]# tail -5 /etc/shadow
# 密码字段为加密哈希,各机器不同,这里仅示意:
sshd:!!:18713:0:99999:7:::
chrony:!!:18713:0:99999:7:::
tcpdump:!!:18713:0:99999:7:::
命令拆解:head / tail 是查日志的日常主力。额外送一个参数:tail -f 文件名 可以实时滚动追踪日志新增内容,运维排查必备。
1.8 find + 通配符:按命名模式全盘查找
目标:在根目录下查找"两个大写字母开头、以一位数字结尾"的 .txt 文件。
[root@lym grub2]# find / -name "[A-Z][A-Z]*[0-9].txt" 2>/dev/null
/usr/share/licenses/gpgme/LICENSES.LICENSE_1.1.txt
/usr/share/licenses/libffi/LICENSE_1.0.txt
/usr/share/licenses/libsepol/LICENSE_1.0.txt
命令拆解:-name 支持通配符——[A-Z] 匹配任意一个大写字母,* 匹配任意长度中间内容,[0-9] 匹配一位数字。结果里全是软件自带的 LICENSE_1.0.txt 之类文件,正好符合"大写 + 数字结尾"的模式。
💡 提示:全盘 find / 会顺带扫到 /proc、/sys 等虚拟文件系统并刷出一堆 Permission denied。加 2>/dev/null 把错误信息丢弃,只留干净的结果(root 用户权限足够,一般不用)。
1.9 ln -s:给文件建一个"快捷方式"
目标:为 /etc/grub2.cfg 建立软链接到桌面。
[root@lym grub2]# ln -s /etc/grub2.cfg /root/Desktop/grub2.cfg
[root@lym grub2]# ls -l /root/Desktop/grub2.cfg
lrwxrwxrwx. 1 root root 15 11月 6 22:00 /root/Desktop/grub2.cfg –> /etc/grub2.cfg
命令拆解:-s 表示软链接(符号链接),相当于 Windows 的快捷方式。注意第一列是 l(link),-> 指向原文件路径。原文件动了,链接跟着变;原文件删了,链接就失效。软链接和硬链接的区别,见第三节的对比表。
二、vi 编辑器十连:从入门到进阶
2.0 先搞懂:vi 的三种工作模式(不懂这个,vi 就是迷宫)
| 普通模式(命令模式) | 打开 vi 默认进入 | 移动光标、复制、粘贴、删除、撤销 |
| 插入模式 | 普通模式下按 i / a / o | 输入、编辑文本 |
| 末行模式(ex 模式) | 普通模式下输入 : | 保存、退出、查找、替换、写文件 |
模式切换的核心逻辑:插入模式和末行模式之间不能直接跳转,必须先按 Esc 回到普通模式。记住这句,90% 的"vi 退不出来"问题就消失了。
2.1 创建文件并写入内容:vi + i + :wq
目标:进入 /tmp,清空该目录,用 vi 创建 test 文件,写入一句话并保存,最后 cat 验证。
[root@lym ~]# cd /tmp
[root@lym tmp]# rm -rf /tmp/* # /tmp 是临时目录,清空无风险(但请先确认自己在 /tmp!)
[root@lym tmp]# vi test # 打开/新建 test 文件
在 vi 中的操作序列:
i # 进入插入模式
Liuyiming likes openEuler! # 输入内容
Esc # 回到普通模式
:wq # 末行模式:保存并退出
[root@lym tmp]# cat test
Liuyiming likes openEuler!
2.2 追加多行内容:重新打开继续编辑
目标:向 test 文件追加 5 行电话号码记录。
vi 操作序列:i 进入插入模式 → 逐行输入 Phone num1 到 Phone num5 → Esc → :wq,然后:
[root@lym tmp]# cat test
Liuyiming likes openEuler!
Phone num1:13912345678
Phone num2:13987654321
Phone num3:13813379701
Phone num4:13770012345
Phone num5:18816029001
💡 i、a、o 的区别:i 在光标前插入,a 在光标后插入,o 在下方新开一行插入。用熟 o 能省掉大量回车操作。
2.3 显示行号:set nu(高频使用,建议背下来)
目标:在 vi 中显示 test 文件所有行的行号。
:set nu # 末行模式执行,nu 是 number 的缩写
效果如下,每行前面出现行号,后面做"跳转到第 9 行""复制第 9-12 行"全靠它定位:
1 Liuyiming likes openEuler!
2 Phone num1:13912345678
3 Phone num2:13987654321
4 Phone num3:13813379701
5 Phone num4:13770012345
6 Phone num5:18816029001
💡 想取消行号就是 :set nonu。如果想让行号永久生效,把 set nu 写进 ~/.vimrc 配置文件即可。
2.4 读取外部文件插入当前文件:r 命令
目标:在 test 文件第 2 行之后,插入 /etc/yum.conf 的全部内容。
2G # 普通模式:光标跳到第 2 行
:r /etc/yum.conf # 末行模式:读取文件,插入到当前行之后
插入后,第 2 行 Phone num1 之后多出了 yum.conf 的内容([main]、gpgcheck=1 等):
1 Liuyiming likes openEuler!
2 Phone num1:13912345678
3 [main]
4 gpgcheck=1
5 installonly_limit=3
6 clean_requirements_on_remove=True
7 best=True
8 skip_if_unavailable=False
9 Phone num2:13987654321
10 Phone num3:13813379701
11 Phone num4:13770012345
12 Phone num5:18816029001
命令拆解:r = read,把指定文件内容读入并粘贴到光标所在行之后。也可以一步到位写 :2r /etc/yum.conf,效果相同。这个命令在合并配置文件片段时非常实用。
2.5 复制粘贴:nyy + p 的标准姿势
目标:复制第 9-12 行共 4 行,粘贴到第 2 行之后。
9G # 光标跳到第 9 行
4yy # 从当前行开始向下复制 4 行(含当前行)
2G # 光标跳到第 2 行
p # 粘贴到当前行的下方
结果——4 行 Phone num2~5 已经复制到了第 2 行之后:
1 Liuyiming likes openEuler!
2 Phone num1:13912345678
3 Phone num2:13987654321
4 Phone num3:13813379701
5 Phone num4:13770012345
6 Phone num5:18816029001
7 [main]
8 gpgcheck=1
9 installonly_limit=3
10 clean_requirements_on_remove=True
11 best=True
12 skip_if_unavailable=False
13 Phone num2:13987654321
14 Phone num3:13813379701
15 Phone num4:13770012345
16 Phone num5:18816029001
命令拆解:yy 复制当前行,前加数字 4yy 就是复制 4 行;p 粘贴到光标行下方,P(大写)粘贴到上方。
2.6 查找字符串:/关键词
目标:自上而下查找 test 文件中的 num 字符串。
/num # 普通模式直接输入 / + 关键词,回车开始查找
回车后文件中所有 num 会被高亮,光标跳到第一处匹配。
命令拆解:
- n 跳到下一个匹配,N 跳到上一个匹配;
- ?num 是从下往上反向查找;
- 查找高亮想关掉::noh。
2.7 全局替换:s/旧/新/g
目标:把文件中所有 num 替换为 number。
:1,$s/num/number/g
替换后所有 Phone num 变成 Phone number。
命令拆解,这个命令由四部分组成,拆开就再也不会忘:
| 1,$ | 范围:第 1 行到最后一行($ 代表末行,也可简写为 %) |
| s | substitute,替换 |
| /num/number/ | 旧串 / 新串 |
| g | global,每行内全部替换(不加 g 只替换每行第一处) |
2.8 删除行与删除字符:dd 和 x
目标:删除第 1 行,再删除此时第 5 行的前 6 个字符,问:该行第一个字符变成了什么?
1G # 光标跳到第 1 行
dd # 删除当前整行
5G # 光标跳到(新的)第 5 行
6x # 从光标处连续删除 6 个字符
答案揭晓:删除第 1 行后,后面所有行号整体前移 1。此时第 5 行是 Phone number5:18816029001,行首 6 个字符正好是 Phone␣(P、h、o、n、e、空格),删除后该行第一个字符变成 n。
命令拆解:dd 删除整行(前加数字删多行,如 3dd),x 删除光标处单个字符(前加数字删多个)。误删不要慌——按 u 撤销,Ctrl+r 恢复,这是 vi 给你的后悔药。
2.9 把指定行写入新文件:w 命令的花式用法
目标:把 test 的第 2-4 行写入 /tmp/myfile.txt,再把第 1 行追加到该文件末尾。
:2,4w /tmp/myfile.txt # 把第 2~4 行另存为新文件
[root@lym tmp]# cat /tmp/myfile.txt
Phone number2:13987654321
Phone number3:13813379701
Phone number4:13770012345
:1w >> /tmp/myfile.txt # 注意两个 >:追加而不是覆盖
[root@lym tmp]# cat /tmp/myfile.txt
Phone number2:13987654321
Phone number3:13813379701
Phone number4:13770012345
Phone number1:13912345678
命令拆解:
- :2,4w 文件 —— 范围 + write,把指定行写入(覆盖式);
- :1w >> 文件 —— >> 是追加,一个 > 是覆盖。重定向里"一个 > 是覆盖、两个 >> 是追加"的规则,在 vi、shell 里完全通用,这个细节面试也常问。
2.10 保存退出,终验成果
:wq # 保存并退出 test
[root@lym tmp]# cat test
Phone number1:13912345678
Phone number2:13987654321
Phone number3:13813379701
Phone number4:13770012345
number5:18816029001
[main]
gpgcheck=1
installonly_limit=3
clean_requirements_on_remove=True
best=True
skip_if_unavailable=False
Phone number2:13987654321
Phone number3:13813379701
Phone number4:13770012345
Phone number5:18816029001
[root@lym tmp]# cat myfile.txt
Phone number2:13987654321
Phone number3:13813379701
Phone number4:13770012345
Phone number1:13912345678
myfile.txt 的最终内容是 Phone number2、3、4、1——2、3、4 来自 :2,4w,1 来自追加。顺序和预期完全一致,收工。
三、核心概念速答:考试和面试都爱问
3.1 openEuler 常见的文件类型
| – | 普通文件 | 文本、二进制程序、压缩包等 |
| d | 目录文件 | 文件夹 |
| c | 字符设备文件 | 串口、键盘等串行设备 |
| b | 块设备文件 | 硬盘、U 盘等块存储设备 |
| l | 软链接文件 | 符号链接,类似 Windows 快捷方式 |
| p | 管道文件 | 命名管道,用于进程间通信 |
ls -l 输出的第一个字符就是类型标识,一眼可辨。
3.2 硬链接 vs 软链接(高频考点)
| inode | 与原文件共用同一个 inode | 独立 inode,保存的是原文件路径 |
| 删除原文件后 | 链接仍可访问数据 | 链接失效(悬空链接) |
| 跨分区 | ❌ 不能 | ✅ 可以 |
| 链接目录 | ❌ 不能 | ✅ 可以 |
| 创建命令 | ln 源 目标 | ln -s 源 目标 |
一句话记忆:硬链接是文件的"另一个名字",软链接是文件的"指路牌"。
3.3 vi 三种工作模式
- 普通模式:打开 vi 的默认模式,负责光标移动、删除、复制粘贴;
- 插入模式:i / a / o 进入,Esc 退回普通模式,负责输入文本;
- 末行模式:普通模式输入 : 进入,负责保存、退出、查找替换。
3.4 保存与退出命令
| 保存并退出 | :wq(或 :x、ZZ) |
| 强制退出、不保存修改 | :q! |
| 只保存不退出 | :w |
| 只读打开,防止误改 | vi -R 文件 |
四、不止会敲命令:这次实验里藏着运维的"职业规范"
这次实验的主题叫"良行致远",起初我以为只是口号,做完回头看,实验里每个操作都在模拟真实运维场景的红线。分享三点体会,也算是给同样在学 Linux 的朋友一点"实战前的心态准备":
1. 改关键配置文件前,先备份。 实验外我尝试编辑 /etc/ssh/sshd_config 这类关键配置时,养成的固定流程是:cp 备份原文件 → 小步修改 → 用 sshd -t 校验语法 → 新开终端测试连接正常,再关闭旧会话。先备份、后变更、先校验、再上线——这一套流程的价值在于随时可回滚,风险可控。
2. rm 之前,先核对路径。 前面 1.6 节我用了 rm -rf,但执行前一定先 ls 确认目录内容。不抱侥幸心理、主动用交互确认规避风险,这不只是技术习惯,而是对数据和工作结果负责。
3. 出了故障,补救比隐瞒重要。 假如 vi 误删了 /etc/fstab 的挂载行导致重启进不了系统,正确姿势是:进紧急救援模式 → mount -o remount,rw / 把根分区改回可写 → 对照备份补回挂载行 → mount -a 验证无报错后重启。失误人人都有,敢于正视、主动补救,才是"诚信负责"在技术工作中的真正含义。
严谨踏实 + 诚信负责,这八个字撑得起一个运维工程师"行稳致远"的职业生命周期。
五、命令速查表(建议收藏)
文件操作
| pwd | 显示当前路径 | — |
| cd | 切换目录 | ~ 家目录、- 上次目录 |
| touch | 建空文件 / 改时间戳 | -t 指定时间、-r 参照文件 |
| ls -l | 长格式查看 | -a 含隐藏文件、-h 人类可读大小 |
| cp | 复制 | -r 递归复制目录 |
| mv | 移动 / 重命名 | — |
| rm | 删除 | -r 递归、-f 强制、-i 交互确认 |
| head / tail | 看文件头 / 尾 | -n 行数;tail -f 实时追踪 |
| find 路径 -name "模式" | 按名查找 | -type d/f/l 按类型;2>/dev/null 屏蔽报错 |
| ln -s 源 目标 | 创建软链接 | 不加 -s 为硬链接 |
vi 编辑器
| 进入插入模式 | i / a / o |
| 回到普通模式 | Esc |
| 跳转到第 n 行 | nG(如 9G) |
| 复制 n 行 / 粘贴 | nyy / p(下方)P(上方) |
| 删除行 / 字符 | dd(ndd)/ x(nx) |
| 撤销 / 恢复 | u / Ctrl+r |
| 显示 / 取消行号 | :set nu / :set nonu |
| 向下 / 向上查找 | /关键词 / ?关键词(n 下一个) |
| 全局替换 | :%s/旧/新/g |
| 读入外部文件 | :r 文件 |
| 指定行写入文件 | :2,4w 文件 |
| 追加写入 | :1w >> 文件 |
| 保存退出 / 强制退出 | :wq / :q! |
写在最后
19 个操作敲下来,最大的感受是:Linux 的命令不是背出来的,是敲出来的。每个命令单独看都平平无奇,但组合起来(find + 通配符、vi + 重定向)就是真实的工作流。
如果这篇文章帮你理清了某个卡了很久的知识点,点个赞、收藏一下,就是对我最大的鼓励。有疑问欢迎评论区交流,看到都会回复。
推荐延伸阅读方向:openEuler 用户与权限管理(chmod / chown / umask)、软件包管理(yum / rpm)、Shell 脚本入门——这三块吃透,Linux 基础就算真正立住了。
网硕互联帮助中心




评论前必须登录!
注册