Linux 基础学习训练教材 - RockyLinux 9.x

第 3 堂课:文件管理与 vim 初探

文件管理的方式、文件内容的查找,还有最重要的 vim 运作!不过,简单简单讲讲!先熟悉为主!

最近更新时间: 2023/02/20

前一堂课读者应该稍微接触 Linux 文件的管理,这一堂课我们将较深入的操作 Linux 文件管理。 此外,本章课程亦会介绍未来将持续使用的 vim 程序编辑器,学会 vim 对于系统管理员来说,是相当重要的任务! 虽然某些时刻系统可能只会提供 vi 而已,但是,我们用户一般操作 Linux 时,个人建议还是学会 vim 更好!

3.1:文件管理

在 Linux 底下,所有的东西都以文件来呈现,不同的文件特性会有不同的结果。读者可以常见的两种文件格式为:

  • 一般文件:实际放置数据的文件
  • 目录文件:重点在放置『文件名』,并没有实际的数据

为何需要目录档?读者可以想像,如果仅有一个柜子,你将所有书籍全部丢进同一个柜子中,则未来要找数据时,会很难找寻 (因为单品太多)。 若可以有多个柜子,将不同的数据分类放置于各别的柜子中,未来要找某一类别的数据,只要找到该类别的柜子,就能够快速的找到数据 (单品较少), 这就是目录文件的重点。

说实在的,不论是哪种操作系统或文件系统,对你的数据进行分门别类的目录/文件夹规划,进行文件的初次筛选,是很棒的习惯! 而且对于文件系统的搜索效率来说,也会比较快速!

3.1.1:目录的创建与删除

前一堂课已经谈过,目录的创建主要使用 mkdir 这个指令,这个指令将创建一个『空目录』。所谓的『空目录』意指该目录内并没有其他文件的存在。 至于删除目录则使用 rmdir 这个指令,但同理,这个指令仅能『删除空目录』而已。

例题 3.1.1-1:了解基础的工作目录切换、观察隐藏档、拷贝文件、删除非空白目录等任务。请以 student 身份完成下列动作。
  1. 前往 /dev/shm 目录
  2. 在该目录下创建名为 class3 的子目录
  3. 观察 /dev/shm/class3 这个目录的内容,并请说明内部有没有其他文件 (注:使用 ll 加上显示隐藏档的选项)
  4. 通过 cp /etc/hosts /dev/shm/class3 将文件拷贝到该目录内,并观察 class3 目录的内容
  5. 使用 rmdir /dev/shm/class3 尝试删除该目录,并说明可以或不行删除该目录的原因

使用 rm 可以删除文件,但缺省 rm 仅能删除一般文件无法删除目录,除非加上某些选项才行。

例题 3.1.1-2:让含有数据的目录变成空目录,再以 rmdir 删除
  1. 承上一个例题,进入到 /dev/shm/class3 当中,并且使用 rm 删除掉所有该目录下的文件 (非隐藏档)
  2. 回到 /dev/shm 当中,此时能否使用 rmdir 删除 class3 目录?为什么?
  • 观察目录本身的参数

当使用 ll dirname 时,缺省会显示出『该目录下的文件名』,因为目录的内容就是文件名数据。若读者需要了解到目录本身的信息,而不是目录的内容, 可以使用 -d 的选项,如下范例:

[student@localhost ~]$ ll /etc/cron.d
total 4
-rw-r--r--. 1 root root 128 Nov  1 03:55 0hourly
# 此时,你看到的上面的数据,是 /etc/cron.d 目录内的文件名列表,并不是 cron.d 本身的状态!

[student@localhost ~]$ ll -d /etc/cron.d
drwxr-xr-x. 2 root root 21 Feb 16 11:44 /etc/cron.d
# 这时,才是顺利的显示 cron.d 的状态

承上,读者可以清楚的看到有没有加上 -d 的选项结果差异相当大。

3.1.2:通配符

在 bash 的环境中,要查找某些关键字的信息时,需要通过一些终端机环境下的特殊字符的支持,此即为通配符。经常使用的通配符有:

符号意义
*代表『 0 个到无穷多个』任意字符
?代表『一定有一个』任意字符
[ ]同样代表『一定有一个在括号内』的字符(非任意字符)。例如 [abcd] 代表『一定有一个字符, 可能是 a, b, c, d 这四个任何一个』
[ - ]若有减号在中括号内时,代表『在编码顺序内的所有字符』。例如 [0-9] 代表 0 到 9 之间的所有数字,因为数字的语系编码是连续的!
[^ ]若中括号内的第一个字符为指数符号 (^) ,那表示『反向选择』,例如 [^abc] 代表 一定有一个字符,只要是非 a, b, c 的其他字符就接受的意思。

若读者想要了解 /etc 底下有多少文件名开头为 cron 的文件时,可以使用如下的方式查找:

[student@localhost ~]$ ll /etc/cron*
[student@localhost ~]$ ll -d /etc/cron*

如果加上 -d 的选项,则文件名会变得比较单纯,但若没有加上 -d 的选项,则 ll 会列出『许多目录内的文件名数据』, 与缺省想要了解的文件名有所差异。因此 -d 选项就显的更为重要。

例题 3.1.2-1:使用通配符搭配,来找出某些特殊的文件名
  1. 列出 /etc/ 底下含有 5 个字符的文件名
  2. 列出 /etc/ 底下含有数字在内的文件名

3.1.3:文件及目录的拷贝与删除

前一堂课也稍微介绍过拷贝,拷贝主要使用 cp 来处理,相关的选项请自行 man cp 来查找。 缺省 cp 仅拷贝文件,并不会拷贝目录,若需要拷贝目录,一般建议直接加上 -r ,而如果是需要完整备份,则最好加上 -a 的选项为宜。 至于为何是 -a,也请自行 man cp 喔!

另外,除了正常的一般文件与目录文件之外,系统也经常会有链接档的情况出现,例如底下的数据:

[student@localhost ~]$ ll /etc/rc.local /etc/rc.d/rc.local
-rw-r--r--. 1 root root 474 Nov 15 18:18 /etc/rc.d/rc.local
lrwxrwxrwx. 1 root root  13 Nov 15 18:18 /etc/rc.local -> rc.d/rc.local

链接档的特色是,该行开头的 10 个字符最左边为 l (link) ,一般文件为减号 (-) 而目录档为 d (directory)。 如上表所示,其实 /etc/rc.local 与 /etc/rc.d/rc.local 是相同的数据,其中 /etc/rc.local 是链接档,而源文件为 /etc/rc.d/rc.local。 此时读者需要注意,亦即当你打开 /etc/rc.local 时,代表实际编辑 /etc/rc.d/rc.local 那个文件的意思。

  • 拷贝目录时

一般来说,拷贝目录需要加上 -r 或 -a,两者的差异如下:

# 先理解拷贝链接档需要注意的事项:
[student@localhost ~]$ cd /dev/shm
[student@localhost shm]$ ll /var
drwxr-xr-x. 13 root root 4096 Feb 20 00:30 log
lrwxrwxrwx.  1 root root   10 May 16  2022 mail -> spool/mail
drwxr-xr-x.  2 root root    6 May 16  2022 nis
....

[student@localhost shm]$ cp -r /var/mail .
[student@localhost shm]$ ll
lrwxrwxrwx. 1 student student  10 Feb 20 10:38 mail -> spool/mail
# 由于这个 /var/mail 链接到的是一个目录档,因此,当你拷贝时,若结尾没有加上 / 的话,
# 就会像这个案例一样,你只是拷贝链接档本身,而不是原本实际的数据。

[student@localhost shm]$ rm mail
[student@localhost shm]$ cp -r /var/mail/ .  <==结尾一定要加上斜线 /
[student@localhost shm]$ ll
drwxr-xr-x. 2 student student  60 Feb 20 10:41 mail   <==这样就拷贝过来了。

# 查看使用 -r 拷贝时,两个目录间的差异:
[student@localhost shm]$ ll mail /var/mail/
mail:
total 0
-rw-r-----. 1 student student 0 Feb 20 10:41 student

/var/mail/:
total 0
-rw-rw----. 1 student mail 0 Feb 16 11:51 student
# 因为我们用一般帐号尝试拷贝,所以权限不同还 OK。问题是,怎么连文件的时间也不同?

# 测试 -a 拷贝时,尝试拷贝权限的行为状态:
[student@localhost shm]$ cp -a /var/mail/ mail2
[student@localhost shm]$ ll mail2
-rw-rw----. 1 student student 0 Feb 16 11:51 student
# 看起来时间参数就跟原本的相同了。

读者可以发现 -a 时,连同文件的时间也都拷贝过来,而不是使用目前的时间来创建新的文件。此外,如果以 root 的身份来运行上述指令时, 则连同权限 (前面的 root 变成 student) 也会跟源文件案相同!这就是 -r 与 -a 的差异。因此,当系统备份时,还是建议使用 -a 的。

  • 目标文件的存在与否

当你使用 cp 进行拷贝时,先来查看一下 cp --help 的语法说明:

[student@localhost ~]$ cp --help
用法:cp [选项]... [-T] 来源 目的地
  或:cp [选项]... 来源... 目录
  或:cp [选项]... -t 目录 来源...
Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.
......

在基本的语法当中,如果来源只有一个,那么目的地就不限制是文件或目录。如果来源有多个,那么最后的目的地就一定要是目录。 那如果加上 -t 呢,则必需要来源与目标的顺序对调...这个作法也相当有趣,我们可以查看一下底下的范例来理解『目的地』是文件或目录时的差异。

例题 3.1.3-1:目的地的目录是否存在,会影响到拷贝的行为。
  1. 先进入 /dev/shm ,同时观察目录下有无名为 rc.d 的文件名
  2. 使用『 cp -r /etc/rc.d rc.d 』将 rc.d 拷贝到本目录下,然后使用 ll 与 ll rc.d 观察该目录
  3. 重新运行上述拷贝的指令一次,然后使用 ll rc.d ,观察一下有什么变化?

当拷贝目录,且目标为未存在的目录,则系统会创建一个同名的目录名称来存放数据。但若目标文件已存在, 则原始目录将会被放置到目标文件内,因此目标目录是否存在,会影响到拷贝的结果

  • 删除文件

删除文件使用 rm,其中需要特别注意,不要随便使用 rm - rf 这样的选项,因为 -r 为删除目录, -f 为不询问直接删除, 因此若后续的文件名写错时,将会有相当大的影响 (一般来说,文件删除是无法救援回来的)。

例题 3.1.3-2:删除的实验
  1. 进入 /dev/shm ,观察到前一个例题 /dev/shm/rc.d 的目录存在后,请将它删除

3.1.4:特殊文件名的处理方式

在 windows 底下经常会有比较特别的文件名出现,最常出现者为文件名含空白字符的情况。由于指令操作行为下,空白键亦为特殊字符, 因此操作上需要将这些特殊字符改为一般字符后,方可进行处理。常见的处理方式有这些情况:

  • 空白字符的文件名

一般可以使用单引号或双引号或反斜线 (\) 来处理这样的文件名。例如创建一个名为『 class one 』的文件名时,可以这样做:

[student@localhost ~]$ cd /dev/shm
[student@localhost shm]$ mkdir "class one"
[student@localhost shm]$ ll
drwxr-xr-x. 2 student student 40 Feb 20 10:50 'class one'

RockyLinux 9 很特别,在有特殊文件名的状态下,会主动的在文件名左右两侧加上单引号~不过,这只是显示的状态而已, 事实上,这个文件名其实是没有单引号的喔!不要被 ll 的结果误导了。

读者可以发现最右边出现了 class one 的文件名,但这个文件名要如何删除呢?

[student@localhost shm]$ rmdir class one
rmdir: failed to remove ‘class’: 没有此一文件或目录
rmdir: failed to remove ‘one’: 没有此一文件或目录

[student@localhost shm]$ rmdir class\ one
# 其实,使用『 rmdir cla[tab] 』就可以让 bash 自动帮你将文件名补齐喔!

如果仅单纯的补上文件名,则 rmdir 会误判有两个名为 class 与 one 的目录要删除,因为找不到,所以回报错误。此时你可以使用成对双引号或单引号来处理, 也可以通过反斜线将空白变成一般字符即可 (其实通过按下 [tab] 按钮也可以找到上述的方式来删除!)

  • 加号与减号开头的文件名

读者应该知道指令下达时,在指令后的选项为开头是 + 或 - 的项目,如果文件名被要求创建成 -newdir 时,该如何处理?

[student@localhost shm]$ mkdir -newdir
mkdir: 不适用的选项 -- n
Try 'mkdir --help' for more information.

此时会回报错误,若尝试使用单引号来处理时,同样回报错误!使用反斜线,同样回报错误。是否无法创建此类文件名呢? 其实读者可以通过『绝对/相对路径』的作法来处理,例如:

[student@localhost shm]$ mkdir /dev/shm/-newdir  <==这是绝对路径文件名
[student@localhost shm]$ mkdir ./-newdir2        <==这是相对路径文件名
[student@localhost shm]$ ll -d ./*new*
drwxr-xr-x. 2 student student 40 Feb 20 10:52 ./-newdir
drwxr-xr-x. 2 student student 40 Feb 20 10:52 ./-newdir2

这样就可以创建开头为 + 或 - 的文件名。删除同样得要使用这样的文件名撰写方式来处理。

例题 3.1.4-1:删除特殊的文件名
  1. 使用 rm --help 查找一下,是否有关于文件名为 - 开头的处理模式?
  2. 将刚刚创建的 -newdir, -newdir2 删除

3.1.5:隐藏档的观察与文件类型的观察

  • 观察隐藏文件

要观察隐藏档时,可以使用如下的方式来处理:

# 缺省情境,亦即不显示隐藏档
[student@localhost shm]$ cd
[student@localhost ~]$ ll
total 8
drwxr-xr-x. 2 student student   6 Feb 17 13:49 Desktop
drwxr-xr-x. 2 student student   6 Feb 17 13:49 Documents
drwxr-xr-x. 2 student student   6 Feb 17 13:49 Downloads
.......

# 同时显示隐藏档与正常文件
[student@localhost ~]$ ll -a
total 40
drwx------. 14 student student 4096 Feb 19 22:08 .
drwxr-xr-x.  3 root    root      21 Feb 16 11:51 ..
-rw-------.  1 student student 2883 Feb 19 23:05 .bash_history
-rw-r--r--.  1 student student   18 Nov  2 00:47 .bash_logout
-rw-r--r--.  1 student student  141 Nov  2 00:47 .bash_profile
.......

# 特殊情境,只会显示隐藏档
[student@localhost ~]$ ll -d .*

由于隐藏档是文件名开头为小数点的文件名,因此可以通过 -a 来查找所有的文件,或者是通过 .* 来找隐藏档而已。 不过得要加上 -d 的选项才行,否则会连同一堆目录内容也被抓出来,画面就太乱了。

  • 观察文件的类型

但如果需要观察文件的类型与型态,就需要使用 file 这个指令来观察。例如分别找出 /etc/passwd 即 /usr/bin/passwd 这两个文件的格式为何?

[student@localhost ~]$ ll /etc/passwd /usr/bin/passwd
-rw-r--r--. 1 root root  2098 Feb 16 11:51 /etc/passwd
-rwsr-xr-x. 1 root root 32656 May 15  2022 /usr/bin/passwd

[student@localhost ~]$ file /etc/passwd /usr/bin/passwd
/etc/passwd:     ASCII text
/usr/bin/passwd: setuid ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), 
 dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2,
 BuildID[sha1]=3e7d2823ae1f6faa96ad82397a23238094040086, for GNU/Linux 3.2.0, stripped

读者即可知道这两个文件分别是文本档 (ASCII text) 及运行档 (ELF 64-bit LSB...)。

例题 3.1.5-1:查找文件的类型
  1. 观察 /var/mail , /var/spool/mail , /dev/null , /dev/vda 的文件类型为何?

3.1.6:文件名的移动与更名

若文件创建到错误的位置时,可以使用 mv 来处理。同时若文件名键错,也能够使用 mv 来更名。

例题 3.1.6-1:如何进行文件的更名
  1. 让 student 回到家目录
  2. 将 /etc/rpm 拷贝到本目录
  3. 该目录移动错误,请将本目录的 rpm 移动到 /dev/shm
  4. 文件名依旧错误,请将 /dev/shm 底下的 rpm 更名为 mail3

3.1.7:大量建置空白文件的方式

有时候为了测试系统,管理员可能需要创建许多的文件名来测试,此时可以通过 touch 这个指令来处理。例如到 /dev/shm 创建名为 testdir 与 testfile 两个『目录档与一般档』, 可以这样处理。

[student@localhost ~]$ cd /dev/shm
[student@localhost shm]$ mkdir testdir
[student@localhost shm]$ touch testfile
[student@localhost shm]$ ll -d test*
drwxr-xr-x. 2 student student 40 Feb 20 11:04 testdir
-rw-r--r--. 1 student student  0 Feb 20 11:04 testfile

如果需要创建较多的文件名,例如 test1, test2, test3, test4 时,可以通过大括号的方式来处理。例如在 /dev/shm 底下创建上述的四个文件,可以这样处理:

[student@localhost shm]$ touch test{1,2,3,4}
[student@localhost shm]$ ll -d test?
-rw-r--r--. 1 student student 0 Feb 20 11:05 test1
-rw-r--r--. 1 student student 0 Feb 20 11:05 test2
-rw-r--r--. 1 student student 0 Feb 20 11:05 test3
-rw-r--r--. 1 student student 0 Feb 20 11:05 test4

如果所需要的文件名或输出信息是有用到连续数字时,假设由 1 到 10 这组数字,虽然能使用 {1,2,3,4,5,6,7,8,9,10} 来处理,然而输入太繁琐。 此时可以使用 {1..10} 来取代上述的输出。若需要输出 01, 02 这样的字样 {01..10} 来处理。

例题 3.1.7-1:大量建置文件的方法,通过 {} 的辅助
  1. 我需要在 /dev/shm/testing 目录下创建名为 mytest_XX_YY_ZZ 的文件,其中 XX 为 jan, feb, mar, apr 四个数据, YY 为 one, two, three 三个数据,而 ZZ 为 a1, b1, c1 三个数据,如何使用一个指令就创建出上述的 36 个文件?
  2. 我需要在 /dev/shm/student/ 目录下,创建文件名为 4XXXC001 到 4XXXC050 的文件,如何使用一个指令来完成这 50 个文件的建置?

3.2:文件内容的查找

很多时候管理员只是需要知道文件内容,并没有进行编辑。此时可以通过一些简易的指令来查找文档文件的内容。

3.2.1:连续输出文件内容

最简单的查找文件内容的方式为通过 cat, head 与 tail 等指令。cat 为较常用的指令,但是 cat 会将文件完整的重现在屏幕上, 因此若管理员想要查找最后几行时,以 tail 指令查找会较佳。

  • cat:将文件内容全部列出
  • head:缺省只列出文件最前面 10 行
  • tail:缺省只列出文件最后面 10 行
例题 3.2.1-1:用不同的指令查找文件的内容
  1. 列出 /etc/hosts 文件的内容
  2. 列出 /etc/profile 文件的内容
  3. 承上,第二次列出 /etc/profile 时加上行号输出
  4. 读者仅须列出 /etc/profile 的最前面 10 行
  5. 读者仅须列出 /etc/passwd 最后面 10 行的内容
  6. 读者仅须列出 /etc/services 最后 5 行的内容

3.2.2:可检索文件内容

上述的 cat/head/tail 需要查找数据时,得要人工眼力查找,因此,如果数据量比较大,而且需要查找信息时,可以通过 more 与 less 来处置。 more 缺省会一页一页向后翻动,而 less 则可以向前、向后翻页,事实上, man page 就是调用 less 指令的函数处理的方式。

more 软件内常用指令:

  • /关键字:可以查找关键字
  • 空白键:可以向下/向后翻页
  • q:结束离开不再查找文档

less 软件内常用指令:

  • /关键字:可以查找关键字
  • 空白键:可以向下/向后翻页
  • [pageup]:可以向前/向上翻页
  • [pagedown]:可以向下/向后翻页
  • g:直接来到第一行
  • G:直接来到最后一行
  • q:结束离开不再查找文档
例题 3.2.2-1:了解 more 与 less 的用法
  1. 使用 more /etc/services 一页一页翻动数据
  2. 承上,请找出 http 这个关键字,之后直接离开不再查阅
  3. 使用 less /etc/services 查找文件内容
  4. 承上,请找出 http 这个关键字,重复查找 http 数次后,之后直接离开不再查阅

若需要查找数据的行号时,可以通过 cat -n 配合管线命令来处理。例如,先将 /etc/services 的输出加上行号,然后交由 less 处理,再去搜索 http 所在行, 要运行这个指令则为:

[student@localhost ~]$ cat -n /etc/services | less

关于管线命令的使用,后续的章节会谈论更多,在此读者仅须知道在管线 (|) 之前所输出的信息,会传给管线后的指令继续读入处理的意思。 亦即消息数据并不是来自文件,而是来自于前一个文件的输出。

3.3:vim 程序编辑器

管理员总是会需要变动系统设置档,或者是进行纯文本档的编辑,此时就需要 vi/vim 的支持。因为 vi/vim 是 Linux 很多指令缺省会去调用的编辑程序, 因此管理员『务必』要学会这个编辑器。另外, vim 会有颜色的支持, vi 仅为文书编辑器,故我们建议读者们,应该要熟悉 vim 较佳。

3.3.1:简易的 vim 操作

vim 有数种基本的模式,亦即是:

  • 一般指令模式 (command mode):使用『 vim filename 』进入 vim 之后,最先接触到的模式。 在这个模式底下用户可以进行拷贝、删除、粘贴、移动光标、复原等任务。
  • 编辑模式 (edit mode):在上述模式底下输入『 i 』这个按钮,就可以进入编辑模式,终于可以开始打字编辑文档了。
  • 延伸指令列命令模式 (extended command mode):这个模式可以进行保存、离开、强制离开、搜索与取代等动作。
  • 选取模式 (vitual mode):这个模式可以进行类似鼠标圈选的选取模式,主要分为三种圈选方式:
    • v :字符方式圈选;
    • [shift]+v :以整行方式圈选
    • [ctrl]+v :以区块方式圈选
    圈选完毕后,可以按下 y 拷贝、可以按下 d 删除,然后在其他地方可以按下 p 粘贴喔!

简单的说,读者可以将数种模式使用底下的图标来思考一下相关性:

图 3.3.1-1、vim 数种模式的相互关系
图 3.3.1-1、vim 数种模式的相互关系

假设读者想要尝试编辑 /etc/services 这个文件,可以这样尝试处理看看:

  1. 使用『 cd /dev/shm 』将工作目录移动到内存当中
  2. 使用『 cp /etc/services . 』将文件拷贝一份到本目录下
  3. 使用『 vim services 』开始查阅 services 的内容,并请回答:
    图 3.3.1-2、vim 的编辑显示画面
    图 3.3.1-2、vim 的编辑显示画面
    1. 最底下一行显示的『 "services" 11473L, 692252B 』是什么意思?
      (Ans: 代表文件名、行数、比特数)
    2. 为什么在 # 之后的文本颜色与没有 # 的那行不太一样?
      (Ans: vim 会依据系统的设置,给予注解与否的颜色展示)
  4. 使用方向键,移动光标到第 100 行,并回答,你怎么知道光标已经在第 100 行?
  5. 图 3.3.1-3、vim 的编辑显示画面
    图 3.3.1-3、vim 的编辑显示画面
  6. 回到第 5 行,按下『 i 』之后,你看到画面中最底下一行的左边出现什么?
  7. 图 3.3.1-4、vim 的编辑显示画面
    图 3.3.1-4、vim 的编辑显示画面
  8. 按下 Enter 按钮以添加一行,然后方向键重回第 5 行,之后随便输入一串文本。 输入完毕后,直接按下 [esc] 按钮,屏幕最下方左下角会有什么变化?
  9. 图 3.3.1-5、vim 的编辑显示画面
    图 3.3.1-5、vim 的编辑显示画面
  10. 要离开时,记得关键字是 quit,此时请按下『 :q 』,看一下光标跑到什么地方去了?
  11. 图 3.3.1-6、vim 的编辑显示画面
    图 3.3.1-6、vim 的编辑显示画面
  12. 在输入『 :q 』并且按下 Enter 之后,屏幕最下方出现什么信息?怎么会这样?
  13. 图 3.3.1-7、vim 的编辑显示画面
    图 3.3.1-7、vim 的编辑显示画面
  14. 按下『 :w 』保存,然后重新『 :q 』离开,这时可以离开了嘛?
例题 3.3.1-1:实习 vim 的练习
  1. 承上,继续 vim services
  2. 请在第 1 行加上『 Welcome to my linux server 』的字样,输入完毕后请回到一般指令模式
  3. 在一般指令模式底下,跑到第 5 行,按下『 dd 』,看看发生什么事情?
  4. 回到第 1 行,按下『 p 』又出现什么信息?
  5. 连续按下 5 次『 p 』,然后又按一次『 5p 』又出现什么?
  6. 按下『 u 』会出现什么状况?
  7. 跑到第 1 行,按下『 yy 』然后跑到第 10 行,按下『 p 』,又出现什么情况?
  8. 按下『 G 』(注意大小写),光标跑到哪里去?
  9. 按下『 gg 』(注意大小写),光标跑到哪里去?
  10. 现在不想要编辑这个文件了 (因为乱搞一通),不保存离开时,按下『 :q 』会一直出现仅告尚未存盘的消息, 你输入『 :q! 』之后,可以不保存离开了嘛?

3.3.2:常用的 vim 一般指令模式与指令列模式列表

通过上述的练习,读者应该会对 vim 有初步的认识。vim 的功能其实不只这些,不过管理员会经常用到的大概就是上述的这些信息而已。 底下为常用的指令列表:

惯用的指令说明
i, [esc] i 为进入编辑模式, [esc] 为离开编辑模式
G 移动到这个文件的最后一列
gg 移动到这个文件的第一列
nG n 为数字,移动到这个文件的第 n 列,例如 10G 为让光标去到第 10 列
dd dd 为删除光标所在行,5dd 为删除 5 行,ndd 为删除 n 行
yy yy 为拷贝光标所在行,5yy 为拷贝 5 行,nyy 为拷贝 n 行
p 在光标底下粘贴刚刚删除/拷贝的数据
u 复原前一个动作
:w 将目前的数据写入硬盘中
:q 离开 vim
:q! 不保存 (强制) 离开 vim

读者大概之要知道这几个按钮即可,其他的更高端的功能有用到的时候再到基础学习篇查阅即可。

例题 3.3.2-1:使用 history 记载下达过得指令,并使用 vim 的『选取模式』进行数据删减
  1. 使用 student 的身份输入 history ,查阅这次有效的历史命令有几个,假设有 50 笔新的指令好了。
  2. 使用『 history 50 >> ~/history.log 』将指令纪录到 history.log 文件中
  3. 使用『 vim ~/history.log 』编辑该文件,将无效的指令移除,只剩下有需要的文件,同时在指令后说明该指令的用途。

3.3.3:修改 vim 的环境设置 .vimrc

包括 RockyLinux 9 ,在 RHEL 8 以后的系统,vim 的版本自动化的太厉害了!加上许多缩进与前后数行提前显示等等。RockyLinux 9 这一版的 vim 增加更多功能。包括在光标所在行之前、后的 5 行自动先行显示等等。 不过,对某些人来说,增加这些自动判断的功能,反而会影响到某些拷贝、粘贴的工作!所以,你可能会想要取消这些特定的功能。 如何取消呢?可以通过 vim 的 :set 功能来处理!

实际练习:让你的 vim 环境自动加上行号,同时取消/加载语法检验:
  1. 同样的,再次编辑你的 service 文件,进入编辑之后,在一般指令列模式下,输入『:set nu』来设置行号, 一切顺利的话,应该会出现类似底下的模样:
    图 3.3.3-1、vim 一些设置值处理
    图 3.3.3-1、vim 一些设置值处理
  2. 那如果想要取消语法检查,尤其在某些黑底白字的环境下,光是看蓝色字体的环境,会崩溃!可以用『:syn off』取消!
    图 3.3.3-2、vim 一些设置值处理
    图 3.3.3-2、vim 一些设置值处理

不过,上述的功能设置,都会在下次重新打开新的 vim 时被还原成默认值。如果你想要每次都生效的设置,那就得要修改家目录下的 vim 设置档, 文件名是 ~/.vimrc 喔!在设置档内,双引号是注解~如果你以前用过 vim, 而且觉得以前的环境比较适应的话,那可以将你的 ~/.vimrc 内容修订成为底下的模样即可:

[student@localhost ~]$ vim ~/.vimrc
" 设置搜索到的关键字为高亮度反白
set hlsearch
" 设置语法检验功能
syntax on
" 取消自动搜索机制
set noincsearch
" 搜索时,忽略大小写的差异
set ignorecase
" 设计自动缩进
set autoindent
" 设置自动产生行号
set nu
" 设置 tab 的宽度为 8 个字符
set tabstop=8
" 设置预先显示的行数为 0,亦即不预先显示
set scrolloff=0
" 设置不要折行
set nowrap
" 设置光标所在行显示特殊字样
set cursorline

保存后离开,以后你使用 vim 编辑数据时,就会出现类似底下的图标了!如果不喜欢,就自己修改掉相关的设置吧!

图 3.3.3-3、vim 一些设置值处理
图 3.3.3-3、vim 一些设置值处理

3.4:课后练习操作

  • 上课的课后练习,非作业:
  1. 关于 vim 创建文件,以及数据的转存情况:(使用 student 身份)
    1. 先用 vim 创建一个名为 /dev/shm/mycheck.txt 的文件,里面填写你的姓名与学号,一行一个
    2. 使用 file 去检查 /etc/group /bin/groups 的文件类型,并将查找的数据转存并累加到 /dev/shm/mycheck.txt 当中
    3. 查找出 /etc/ 底下,使用 s 开头以及 s 结尾的文件名 (不含子目录下的文件),并将找到的文件名转存并累加一份到 /dev/shm/mycheck.txt 当中
    4. 找出最近有使用过的 rm 的指令,并将该运行的指令转存并累加到 /dev/shm/mycheck.txt 当中
    5. 将 /etc/passwd 前 5 行与最后 5 行抓出来,并且附上行号之后,转存并累加到 /dev/shm/mycheck.txt 当中
  2. 关于文件管理:(使用 student 身份)
    1. 尝试在 /dev/shm/unit03/files/ 目录下,添加 ksu001 ~ ksu100 这 100 个空文件
    2. 尝试在 /dev/shm/unit03/dirs/ 目录下,添加 dir01 ~ dir10 这 10 个空目录
    3. 尝试在 /dev/shm/unit03/season/ 目录下,添加 jan, feb, mar 这三个空目录
    4. 尝试在 /dev/shm/unit03/seaon/ 目录下的 jan, feb, mar 子目录内,创建 mylog_XX_YY_ZZ.txt 空文件,其中:『XX 为 1~9』, 『YY 为 aa 与 bb』,『ZZ 为 start 与 end』。
    5. 尝试在 /dev/shm/unit03/spc/ 目录下,创建名为 -check.txt 的目录
  • 作业 (不提供学生答案,仅提供教师参考答案)

作业硬盘一般操作说明:

  • 打开云端虚拟机前,请务必确认你打开的硬盘是『unit03』,否则就会做错题目
  • 若要使用图形界面,请务必使用 student 身份登录,若需要切换身份,再激活终端机处理。
  • 若有简答题需要使用中文,请自行以第一堂课的动作自行处理输入法安装。
  • 每部虚拟机均有独特的网卡地址,请勿使用他人硬盘上传,否则计分为 0 分。
  • 每位同学均有自己的 IP 尾数,请先向老师询问您的 IP 尾数,才可以进行作业上传。
  • 最终上传作业结果,请务必使用 root 身份上传。
  • 进入作业硬盘后,先用 root 身份运行 vbird_book_setup_ip , 运行流程请参考:vbird_book_setup_ip

作业当中,某些部份可能为简答题~若为简答题时,请将答案写入 /home/student/ans.txt 当中,并写好正确题号,方便老师订正答案。 请注意,文件名写错将无法上传!

  1. (20%)使用 vim 创建一个名为 ~/ans.txt 的文件,内容先填写你的学号与姓名,并在找出底下的任务后,写下正确答案 (使用 student 身份进行):
    1. 请先实际找出你系统中的 /etc/passwd, /etc/pam.d /etc/rc.local, /dev/vda 这 4 个文件的『文件类型 (如纯文本文件、运行档等等等)』后, 将这 4 个的类型写入 ~/ans.txt 文件中。
    2. 找出 /usr/lib64 这个目录内,有个文件名长度为 5 个字符的一般文件,将该文件文件名写入 ~/ans.txt 中。
    3. 找出 /etc 底下(不含子目录),文件名含有 4 个数字 (数字不一定连接在一起) 的数据,写下 (1)该文件的『绝对路径』文件名,(2)该文件的类型
  2. (30%)在 student 家目录下,添加一个名为 class03 的目录,并进入该目录成为工作目录,并且完成底下的工作 (底下所谓的『当前目录』都在 class03 目录下!):
    1. 在当前的目录下,新建名为 mytest_XX_YY_ZZ.txt 的一堆空白文件,其中 XX 为『 class1, class2, class3 』,而 YY 为『 week1, week2, week3 』,ZZ 则为『 one, two, three, four 』。
    2. 创建一个名为 class1/week2 的目录,将当前目录中,含有 class1_week2 的文件名通通『拷贝』到 class1/week2 目录下
    3. 将文件名含有 class1 文件,通通『移动』到 class1 目录下
    4. 新建一个名为 one 的目录,将当前目录中,所有文件名含有 one 的文件通通『移动』到 one 底下
    5. 创建一个名为 others 的目录,将当前文件名开头为 mytest 的文件,通通『移动』到该目录下 (原则上,做完这题后,在该目录下只剩下子目录,没有一般文件存在才对!)
  3. (30%)回到 student 家目录,并且完成底下的任务:
    1. 在 student 家目录底下,创建一个名为 -myhome 的目录,并将 student 家目录中,以 b 为开头的『隐藏档』拷贝到 -myhome 目录内
    2. 切换工作目录到 -myhome 目录内,并将 /etc/sysconfig 目录拷贝到当前目录下 (过程中产生一些错误消息是正常的!)
    3. 将当前目录下的 sysconfig/cbq 目录删除
    4. 列出 /etc/profile 与 /etc/services 的最后 5 行,并将这 10 行转存到当前目录下的 myetc.txt 文件中 (myetc.txt 缺省不存在)
    5. 将 myetc.txt 拷贝成为 myetc2.txt,并使用 vim 编辑 myetc2.txt ,第一行加入『 I can use vim 』的字样即可。
  4. (20%)其他文件管理:
    1. 在 student 家目录下,创建一个 userid 的子目录,并将工作目录移动到 userid 内,在 userid 这个目录内,尝试以一个指令创建 ksuid001 ksuid002 ... 到 ksuid020 等 20 个『空白目录』
    2. 在 student 家目录下,有个名为 mytext.txt 的文件,请使用 vim 打开该文件,并将第一行拷贝后,粘贴 100 次,之后『强制保存』即可离开 vim 。
    3. 在 /opt 底下,有个以减号 (-) 为开头的文件名,该文件做错了,因此,请将他删除 (可能需要 root 的权限)

作业结果传输:请以 root 的身分运行 vbird_book_check_unit 指令上传作业结果。 正常运行完毕的结果应会出现【XXXXXX_aa:bb:cc:dd:ee:ff_unitNN】字样。若需要查阅自己上传数据的时间, 请在操作系统上面使用浏览器查找: http://192.168.251.254 检查相对应的课程文件。 相关流程请参考: vbird_book_check_unit

修改历史:
  • 2023/02/20:从 CentOS 8.x 改版而来,不过,由于 vim 缺省的设置较多,为了取消默认值,增加修改 .vimrc 的内容!不过,作业尚未整理
  • 2023/02/21:作业硬盘处理完毕,而且加入了实作检查回应结果的小环节~同学可以查看自己的答案了!可以一直作到对为止!
2023/02/20 以来统计人数
计数器
其他链接
环境工程模式篇
鸟园讨论区
鸟哥旧站

今日 人数统计
昨日 人数统计
本月 人数统计
上月 人数统计