云计算百科
云计算领域专业知识百科平台

openEuler 常用命令 + vi 编辑器保姆级实战:9 个文件操作 + 10 个 vi 技巧,一篇通关

/* 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 / 的事故每年都在发生。我的操作习惯是:

  • 删之前先 pwd + ls 核对路径,确认自己"在哪、删什么";
  • 新手尽量用 rm -i,逐个确认再删;
  • 重要数据先备份(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 行到最后一行($ 代表末行,也可简写为 %)
    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 基础就算真正立住了。

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » openEuler 常用命令 + vi 编辑器保姆级实战:9 个文件操作 + 10 个 vi 技巧,一篇通关
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!