请添加图片描述

🎬 博主名称:一鸣

🔥 个人专栏: 《苍穹外卖》《喜喜》

⛺️生活的理想,就是为了理想的生活!


刚装好 openEuler,面对黑漆漆的终端不知道从哪下手?文件操作命令一用就忘、vi 一进去就退不出来?这篇文章用 19 个完整实操案例,带你把 openEuler 最常用的文件命令和 vi 编辑器一次练透。每一步都给出完整命令 + 终端输出实录,命令可以直接复制、输出可以对照验证,跟着敲一遍,比看十篇纯理论都管用。建议先收藏,跟着敲。


前言:这篇实操笔记的由来

最近在 openEuler 课程里完成了「常用命令 + vi 编辑器」的综合实验。做的时候我发现一个普遍问题:命令单个都认识,连起来就懵——cp 和 mv 什么时候该用哪个?touch 除了建空文件还能干什么?vi 里怎么把别人的文件"抄"进来?

于是我把整个实验的 19 个操作整理成这篇笔记,每个操作都包含三样东西:任务目标、完整命令、终端输出实录,中间穿插踩过的坑。你可以把它当成一份"能照着敲"的实操手册。

环境信息(版本信息很重要,照做之前先核对,避免结果对不上):

项目环境
操作系统openEuler(DDE 桌面环境)
用户root
Shellbash
编辑器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. 删之前先 pwd + ls 核对路径,确认自己"在哪、删什么";
  2. 新手尽量用 rm -i,逐个确认再删;
  3. 重要数据先备份(cp -r 一份),再执行删除。

命令可以快,路径必须对。

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 行到最后一行($ 代表末行,也可简写为 %)
ssubstitute,替换
/num/number/旧串 / 新串
gglobal,每行内全部替换(不加 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 基础就算真正立住了。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐