文件管理的方式、文件内容的查找,还有最重要的 vim 运作!不过,简单简单讲讲!先熟悉为主!
前一堂课读者应该稍微接触 Linux 文件的管理,这一堂课我们将较深入的操作 Linux 文件管理。 此外,本堂课亦会介绍未来会一直使用的 vim 程序编辑器,学会 vim 对于系统管理员来说,是相当重要的任务! 虽然某些时刻系统可能只会提供 vi 而已,但是,我们用户一般操作 Linux 时,个人建议还是学会 vim 更好!
在 Linux 底下,所有的东西都以文件来呈现,不同的文件特性会有不同的结果。读者可以常见的两种文件格式为:
为何需要目录档?读者可以想像,如果仅有一个柜子,你将所有书籍全部丢进同一个柜子中,则未来要找数据时,会很难找寻 (因为单品太多)。 若可以有多个柜子,将不同的数据分类放置于各别的柜子中,未来要找某一类别的数据,只要找到该类别的柜子,就能够快速的找到数据 (单品较少), 这就是目录文件的重点。
前一堂课已经谈过,目录的创建主要使用 mkdir 这个指令,这个指令将创建一个『空目录』。所谓的『空目录』意指该目录内并没有其他文件的存在。 至于删除目录则使用 rmdir 这个指令,但同理,这个指令仅能『删除空目录』而已。
使用 rm 可以删除文件,但缺省 rm 仅能删除一般文件无法删除目录,除非加上某些选项才行。
当使用 ll dirname 时,缺省会显示出『该目录下的文件名』,因为目录的内容就是文件名数据。若读者需要了解到目录本身的信息,而不是目录的内容, 可以使用 -d 的选项,如下范例:
[student@localhost ~]$ ll /etc/cron.d 总计 8 -rw-r--r--. 1 root root 128 11月 9 00:47 0hourly -rw-r--r--. 1 root root 108 11月 9 01:45 raid-check # 此时,你看到的上面的数据,是 /etc/cron.d 目录内的文件名列表,并不是 cron.d 本身的状态! [student@localhost ~]$ ll -d /etc/cron.d drwxr-xr-x. 2 root root 39 2月 26 09:05 /etc/cron.d # 这时,才是顺利的显示 cron.d 的状态
承上,读者可以清楚的看到有没有加上 -d 的选项结果差异相当大。
在 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 选项就显的更为重要。
前一堂课也稍微介绍过拷贝,拷贝主要使用 cp 来处理,相关的选项请自行 man cp 来查找。 缺省 cp 仅拷贝文件,并不会拷贝目录,若需要拷贝目录,一般建议直接加上 -r ,而如果是需要完整备份,则最好加上 -a 的选项为宜。 至于为何是 -a,也请自行 man cp 喔!
另外,除了正常的一般文件与目录文件之外,系统也经常会有链接档的情况出现,例如底下的数据:
[student@localhost ~]$ ll -d /etc/rc0.d /etc/rc.d/rc0.d
lrwxrwxrwx. 1 root root 10 5月 11 2019 /etc/rc0.d -> rc.d/rc0.d
drwxr-xr-x. 2 root root 6 5月 11 2019 /etc/rc.d/rc0.d
链接档的特色是,该行开头的 10 个字符最左边为 l (link) ,一般文件为减号 (-) 而目录档为 d (directory)。 如上表所示,其实 /etc/rc0.d 与 /etc/rc.d/rc0.d 是相同的数据,其中 /etc/rc0.d 是链接档,而源文件为 /etc/rc.d/rc0.d。 此时读者需要注意,亦即当你进入 /etc/rc0.d 时,代表实际进入了 /etc/rc.d/rc0.d 那个目录的意思。
一般来说,拷贝目录需要加上 -r 或 -a,两者的差异如下:
# 先理解拷贝链接档需要注意的事项: [student@localhost ~]$ cd /dev/shm [student@localhost shm]$ cp -r /etc/init.d . [student@localhost shm]$ ll lrwxrwxrwx. 1 student student 11 3月 10 09:12 init.d -> rc.d/init.d # 由于这个 /etc/init.d 链接到的是一个目录档,因此,当你拷贝时,若结尾没有加上 / 的话, # 就会像这个案例一样,你只是拷贝链接档本身,而不是原本实际的数据。 [student@localhost shm]$ rm init.d [student@localhost shm]$ cp -r /etc/init.d/ . <==结尾一定要加上斜线 / [student@localhost shm]$ ll drwxr-xr-x. 2 student student 80 3月 10 09:13 init.d <==这样就拷贝过来了。 # 查看使用 -r 拷贝时,两个目录间的差异: [student@localhost shm]$ ll init.d /etc/init.d/ /etc/init.d/: 总计 24 -rw-r--r--. 1 root root 18440 8月 23 2019 functions -rw-r--r--. 1 root root 1161 11月 9 07:13 README init.d: 总计 24 -rw-r--r--. 1 student student 18440 3月 10 09:13 functions -rw-r--r--. 1 student student 1161 3月 10 09:13 README # 因为我们用一般帐号尝试拷贝,所以权限不同还 OK。问题是,怎么连文件的时间也不同? # 测试 -a 拷贝时,尝试拷贝权限的行为状态: [student@localhost shm]$ cp -a /etc/init.d/ init.d2 [student@localhost shm]$ ll init.d2 -rw-r--r--. 1 student student 18440 8月 23 2019 functions -rw-r--r--. 1 student student 1161 11月 9 07:13 README # 看起来时间参数就跟原本的相同了。
读者可以发现 -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 呢,则必需要来源与目标的顺序对调...这个作法也相当有趣,我们可以查看一下底下的范例来理解『目的地』是文件或目录时的差异。
当拷贝目录,且目标为未存在的目录,则系统会创建一个同名的目录名称来存放数据。但若目标文件已存在, 则原始目录将会被放置到目标文件内,因此目标目录是否存在,会影响到拷贝的结果。
删除文件使用 rm,其中需要特别注意,不要随便使用 rm - rf 这样的选项,因为 -r 为删除目录, -f 为不询问直接删除, 因此若后续的文件名写错时,将会有相当大的影响 (一般来说,文件删除是无法救援回来的)。
在 windows 底下经常会有比较特别的文件名出现,最常出现者为文件名含空白字符的情况。由于指令操作行为下,空白键亦为特殊字符, 因此操作上需要将这些特殊字符改为一般字符后,方可进行处理。常见的处理方式有这些情况:
一般可以使用单引号或双引号或反斜线 (\) 来处理这样的文件名。例如创建一个名为『 class one 』的文件名时,可以这样做:
[student@localhost ~]$ cd /dev/shm [student@localhost shm]$ mkdir "class one" [student@localhost shm]$ ll drwxrwxr-x. 2 student student 40 3月 10 09:55 'class one'
CentOS8 很特别,在有特殊文件名的状态下,会主动的在文件名左右两侧加上单引号~不过,这只是显示的状态而已, 事实上,这个文件名其实是没有单引号的喔!不要被 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* drwxrwxr-x. 2 student student 40 3月 10 10:28 ./-newdir drwxrwxr-x. 2 student student 40 3月 10 10:28 ./-newdir2
这样就可以创建开头为 + 或 - 的文件名。删除同样得要使用这样的文件名撰写方式来处理。
要观察隐藏档时,可以使用如下的方式来处理:
# 缺省情境,亦即不显示隐藏档 [student@localhost shm]$ cd [student@localhost ~]$ ll drwx------. 2 student student 6 3月 1 15:35 Desktop drwx------. 2 student student 6 3月 1 15:35 Documents drwx------. 2 student student 6 3月 1 15:35 Downloads ....... # 同时显示隐藏档与正常文件 [student@localhost ~]$ ll -a drwx------. 15 student student 4096 3月 10 10:15 . drwxr-xr-x. 3 root root 21 3月 8 00:15 .. -rw-------. 1 student student 3415 3月 8 00:14 .bash_history -rw-r--r--. 1 student student 18 11月 9 00:21 .bash_logout -rw-r--r--. 1 student student 141 11月 9 00:21 .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 2433 3月 8 00:15 /etc/passwd -rwsr-xr-x. 1 root root 34928 5月 11 2019 /usr/bin/passwd [student@localhost ~]$ file /etc/passwd /usr/bin/passwd /etc/passwd: ASCII text /usr/bin/passwd: setuid ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=4ba7de752293f0c8e4a3547285ea1952492eb9e4, stripped
读者即可知道这两个文件分别是文本档 (ASCII text) 及运行档 (ELF 64-bit LSB...)。
若文件创建到错误的位置时,可以使用 mv 来处理。同时若文件名键错,也能够使用 mv 来更名。
有时候为了测试系统,管理员可能需要创建许多的文件名来测试,此时可以通过 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* drwxrwxr-x. 2 student student 40 3月 10 11:03 testdir -rw-rw-r--. 1 student student 0 3月 10 11:03 testfile
如果需要创建较多的文件名,例如 test1, test2, test3, test4 时,可以通过大括号的方式来处理。例如在 /dev/shm 底下创建上述的四个文件,可以这样处理:
[student@localhost shm]$ touch test{1,2,3,4} [student@localhost shm]$ ll -d test? -rw-rw-r--. 1 student student 0 3月 10 11:03 test1 -rw-rw-r--. 1 student student 0 3月 10 11:03 test2 -rw-rw-r--. 1 student student 0 3月 10 11:03 test3 -rw-rw-r--. 1 student student 0 3月 10 11:03 test4
如果所需要的文件名或输出信息是有用到连续数字时,假设由 1 到 10 这组数字,虽然能使用 {1,2,3,4,5,6,7,8,9,10} 来处理,然而输入太繁琐。 此时可以使用 {1..10} 来取代上述的输出。若需要输出 01, 02 这样的字样 {01..10} 来处理。
很多时候管理员只是需要知道文件内容,并没有进行编辑。此时可以通过一些简易的指令来查找文档文件的内容。
最简单的查找文件内容的方式为通过 cat, head 与 tail 等指令。cat 为较常用的指令,但是 cat 会将文件完整的重现在屏幕上, 因此若管理员想要查找最后几行时,以 tail 指令查找会较佳。
上述的 cat/head/tail 需要查找数据时,得要人工眼力查找,因此,如果数据量比较大,而且需要查找信息时,可以通过 more 与 less 来处置。 more 缺省会一页一页向后翻动,而 less 则可以向前、向后翻页,事实上, man page 就是调用 less 指令的函数处理的方式。
more 软件内常用指令:
less 软件内常用指令:
若需要查找数据的行号时,可以通过 cat -n 配合管线命令来处理。例如,先将 /etc/services 的输出加上行号,然后交由 less 处理,再去搜索 http 所在行, 要运行这个指令则为:
[student@localhost ~]$ cat -n /etc/services | less
关于管线命令的使用,后续的章节会谈论更多,在此读者仅须知道在管线 (|) 之前所输出的信息,会传给管线后的指令继续读入处理的意思。 亦即消息数据并不是来自文件,而是来自于前一个文件的输出。
管理员总是会需要变动系统设置档,或者是进行纯文本档的编辑,此时就需要 vi/vim 的支持。因为 vi/vim 是 Linux 很多指令缺省会去调用的编辑程序, 因此管理员『务必』要学会这个编辑器。另外, vim 会有颜色的支持, vi 仅为文书编辑器,故我们建议读者们,应该要熟悉 vim 较佳。
vim 有数种基本的模式,亦即是:
简单的说,读者可以将数种模式使用底下的图标来思考一下相关性:
假设读者想要尝试编辑 /etc/services 这个文件,可以这样尝试处理看看:
通过上述的练习,读者应该会对 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 |
读者大概之要知道这几个按钮即可,其他的更高端的功能有用到的时候再到基础学习篇查阅即可。
作业硬盘一般操作说明:
作业当中,某些部份可能为简答题~若为简答题时,请将答案写入 /home/student/ans.txt 当中,并写好正确题号,方便老师订正答案。 请注意,文件名写错将无法上传!
作业结果传输:请以 root 的身分运行 vbird_book_check_unit 指令上传作业结果。 正常运行完毕的结果应会出现【XXXXXX_aa:bb:cc:dd:ee:ff_unitNN】字样。若需要查阅自己上传数据的时间, 请在操作系统上面使用浏览器查找: http://192.168.251.254 检查相对应的课程文件。 相关流程请参考: vbird_book_check_unit