Linux 基础学习训练教材 - CentOS 7.x

第 2 堂课:指令下达行为与基础文件管理

开始进行文本终端机模式底下的指令操作行为!以及一点点初阶的文件管理行为啰!

最近更新时间: 2017/03/05

前一堂课最后讲到文本界面的指令下达,这堂课让我们更详尽的玩一下文本界面的指令下达行为吧。 另外,了解到指令下达行为之后,再来当然就是 bash 环境下的文件管理行为,而在实际操作文件管理之前, 基本的目录内数据的了解,也是必须要知道的项目。

2.1:文本界面终端机操作行为的创建

其实我们都是通过『程序』在跟系统作沟通的。文本模式登录后所取得的程序被称为壳(Shell),这是因为这支程序负责最外面跟用户(我们)沟通, 所以才被戏称为壳程序!CentOS 7 的缺省壳程序为 bash,用户最好一开始就能够创建良好的操作行为,对于未来的 Linux 使用上,会有很大的帮助。

2.1.1:文本模式指令下达的方式

bash shell 环境下,指令的下达基本上有几个需要注意的地方:

[student@localhost ~]$ command  [-options]  [parameter1...]
  • 一行指令中第一个输入的部分是指令(command)或可运行文件(例如script)
  • 『 command 』:为指令的名称,例如变换工作目录的指令为 cd 等等;
  • 中括号『 [ ] 』不在实际的指令中,仅作为一个提示,可有可无的数据之意;
  • 『 -options 』:为选项,通常选项前面会带有减号 (-),例如 -h ;
  • options 有时会提供长选项,此时会使用两个减号,例如 --help。
  • 注意,选项 -help 通常代表 -h -e -l -p 之意,与 --help 的单一长选项不同。
  • 『 parameter1... 』:参数,为依附在选项后面的参数,或者是 command 的参数;
  • 指令、选项、参数之间都以空格或 [tab] 作为区分,不论空几格都视为一格,故空白是特殊字符
  • [Enter]按键代表着一行指令的开始启动。
  • Linux 的世界中,英文大小写为不同的字符,例如 cd 与 CD 是不一样的指令。

前一堂课我们使用过 ls 与 ll 这两个简易的指令来查看文件名,那如果想要知道目前的时间,或者是格式化输出时间时, 就得要使用 date 这个指令来处理!

[student@localhost ~]$ date
四  4月 21 02:43:24 CST 2016

因为 student 选择中文语系的关系,所以屏幕上出现的就会是中文的星期四与月日这样。 若需要格式化的输出,就得要加上特别的选项或参数来处理,例如一般台湾我们常见 2016/04/21 这样的日期输出格式, 此时你可能要这样下达指令:

[student@localhost ~]$ date +%Y/%m/%d
2016/04/21

上述的选项数据 (+%Y/%m%d) 基本上不太需要背诵,使用在线查找的方式来处理即可。 最简单的处理方式,可以通过 --help 这个长选项来查找各个选项的功能,如下所示:

[student@localhost ~]$ date --help
Usage: date [OPTION]... [+FORMAT]
  or:  date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
Display the current time in the given FORMAT, or set the system date.

Mandatory arguments to long options are mandatory for short options too.
  -d, --date=STRING         display time described by STRING, not 'now'
  -f, --file=DATEFILE       like --date once for each line of DATEFILE
  -I[TIMESPEC], --iso-8601[=TIMESPEC]  output date/time in ISO 8601 format.
                            TIMESPEC='date' for date only (the default),
                            'hours', 'minutes', 'seconds', or 'ns' for date
                            and time to the indicated precision.
  -r, --reference=FILE      display the last modification time of FILE
  -R, --rfc-2822            output date and time in RFC 2822 format.
                            Example: Mon, 07 Aug 2006 12:34:56 -0600
      --rfc-3339=TIMESPEC   output date and time in RFC 3339 format.
                            TIMESPEC='date', 'seconds', or 'ns' for
                            date and time to the indicated precision.
                            Date and time components are separated by
                            a single space: 2006-08-07 12:34:56-06:00
  -s, --set=STRING          set time described by STRING
  -u, --utc, --universal    print or set Coordinated Universal Time (UTC)
      --help     显示此求助说明并离开
      --version  显示版本信息并离开

FORMAT controls the output.  Interpreted sequences are:

  %%   a literal %
  %a   locale's abbreviated weekday name (e.g., Sun)
  %A   locale's full weekday name (e.g., Sunday)
  %b   locale's abbreviated month name (e.g., Jan)
........

如此即可查找到 %Y, %m, %d 的相关选项功能!

例题:
  1. 如果需要秀出『 小时:分钟 』的格式,要如何运行指令?
  2. 请直接输入指令『 date +%s 』,对照 --help 功能,查找一下输出的信息是什么?
  3. 查找一下 --help 的功能后,如果要显示两天以前 (2 days ago) 的『 +%Y/%m/%d 』,要如何下达指令?
  4. 如果需要显示出『 西元年-日-月 小时:分钟 』的格式,日期与时间中间有一个空格!该如何下达指令?

而如果想要知道年历或者是月历,就可以通过 cal 这个指令来查找

例题:使用 cal 搭配 cal --help 查找相关选项,完成底下的题目。
  1. 显示目前这个月份的月历
  2. 显示今年的年历
  3. 显示前一个月、本月、下一个月的月历

2.1.2:身份切换 su - 的使用

继续来玩一下 date 这个指令!从前一小节使用 date --help 后,可以发现语法有两种情况,如下所示:

[student@localhost ~]$ date --help
Usage: date [OPTION]... [+FORMAT]
  or:  date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
Display the current time in the given FORMAT, or set the system date.

指令说明当中,可以是『显示, display』也能够是『设置, set』日期。语法 (Usage) 的第一行就是显示日期而已,第二行当然就是设置日期了。 如果使用 student 身份来设置日期,会有什么状况?

[student@localhost ~]$ date 042211072016
date: cannot set date: Operation not permitted
Fri Apr 22 11:07:00 CST 2016
[student@localhost ~]$ date
Fri Apr 22 19:05:17 CST 2016

可以发现到日期并没有变更到正确的日期 (第二个 date 指令在确认有没有修订成功,因为两者日期不同,因此确认没有成功)。 而且 date 也明白的告诉操作者,操作者没有权限 (Operation not permitted)!因为日期的设置要系统管理员才能够设置的。 此时我们就得要切换身份成为系统管理员(root)才行。处理的方法如下:

[student@localhost ~]$ su -
密码:
上一次登录:四  4月 21 02:42:42 CST 2016在 tty2
[root@localhost ~]# 

本系统 root 的密码为 centos7 ,因此在『密码:』后面输入 centos7 之后,你就可以发现用户的身份变换成为 root 了! 此时再次使用 date 来看看日期能否被设置为正确?

[root@localhost ~]# date 042211142016
Fri Apr 22 11:14:00 CST 2016
[root@localhost ~]# date
Fri Apr 22 11:14:02 CST 2016

读者们可以发现上表两个指令的操作相差约 2 秒钟,因此输出的信息就会有两秒钟的误差。不过,日期确实就被修订成为目前的状态。 但如果需要完整的设置系统时间,则需要使用 hwclock -w 写入 BIOS 时间钟才行。(由于虚拟机的 BIOS 也是虚拟的,因此不需要使用 hwclock 写入)

另外, root 的身份是作为系统管理所需要的功能,因此做完任何系统维护行为后,请回复到一般用户的身份较佳 (这个习惯请务必养成!)。

例题:
  1. 为何当你使用 su - 切换成 root 之后,想要使用方向键上/下去调用刚刚下达的 date 0421... 指令时,会调用不出来?
  2. 要如何离开 root 再次成为 student ?

2.1.3:语系功能切换

由于我们的系统环境使用中文,因此在日期的输出方面可能就是以中文为主。那如果想要显示为英文年月时,就得要修改一个变量,如下所示:

[student@localhost ~]$ date
五  4月 22 11:24:09 CST 2016
[student@localhost ~]$ LANG=en_US.utf8
[student@localhost ~]$ date
Fri Apr 22 11:24:46 CST 2016

你可以发现日期已经变更成为英文的方式来显示了!此即 LANG 语系变量的设置功能。台湾地区经常使用的语系有中文与英文的万国码两种, 当然,比较旧的数据可能需要使用 big5 编码,所以台湾常见的语系有:

  • zh_TW.utf8
  • zh_TW.big5
  • en_US.utf8

至于语系的变化其实有两个变量可以使用,除了常用的 LANG 之外,也可以通过 LC_ALL 来修订!但一般建议使用 LANG 即可。 而查阅目前语系的方法为:

[student@localhost ~]$ echo ${LANG}
en_US.utf8
例题:
  1. 将语系调整为缺省的 zh_TW.utf8
  2. 输入 locale 查阅一下目前系统上所有使用的各项消息输出语系为何?
  3. 使用 locale --help ,查找一下哪个选项可以列出目前系统所支持的语系?
  4. 承上,请列出所有语系,但是在纯文本模式 (tty2~tty6) 情况下,语系数据量太大,又没有鼠标滚轮可以利用, 此时可以使用哪些组合按钮来显示之前的屏幕画面?
  5. 承上,若想要让命令提示字符出现在第一行 (屏幕最上方),可以输入那一个指令来清空画面?

2.1.4:常见的热键与组合按键

除了上个例题谈到的可以上下移动屏幕画面的组合按键之外,在纯文本模式 (bash shell) 的环境下,建议读者们一定要熟记且经常应用的热键与组合键有:

  • [tab]:可以是命令补齐,可以是文件名补齐,也能是变量名称补齐
  • [ctrl]+c:中断一个运作中的指令
  • [shift]+[PageUp], [shift]+[PageDown]:上下移动屏幕画面
例题:
  1. 系统中以 if 及 ls 为开头的指令,各有哪些?
  2. 有个以 ifco 为开头的指令,详细指令名称我忘记了,你可以找到这个指令名称嘛?
  3. 操作一个指令『 find / 』这个指令输出很乱,我不想看了,该如何中断这个指令?
  4. 操作一个指令『 ls ' 』,因为不小心多按了一个单引号,导致指令输入行为很怪异,如何中断?
  5. 我想用『 ll -d 』去看一下 /etc/sec 开头的文件有哪些,可以怎么做?
  6. 我想要知道,到底有多少变量是由 H 开头的?如何使用 echo 去查阅?

2.1.5:在线求助方式

ll, ls, date, cal 均可使用 --help 来查找语法与相关的选项、参数数据,但某些指令则没有办法显示详细的信息。 例如底下的小算盘指令:

[student@localhost ~]$ bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
1+2+3+4
10
1/3
0
quit

bc 指令为 Linux 纯文本界面下的小算盘,你可以使用 bc --help 查找到相关的选项数据,但是如上所示,加减乘除的符号, 还有小数点位数数据,以及离开 (quit) 等信息,则没有显示于 --help 的输出画面中。Linux 有提供一个名为 manual page (手册页) 的功能, 你可以用 manual 缩写 (man) 来查找,如下所示:

[student@localhost ~]$ man bc
bc(1)                      General Commands Manual                      bc(1)

NAME
       bc - An arbitrary precision calculator language

SYNTAX
       bc [ -hlwsqv ] [long-options] [  file ... ]

DESCRIPTION
       bc is a language that supports arbitrary precision numbers with inter‐
       active execution of statements.  There are some  similarities  in  the
       syntax  to  the  C  programming  language.  A standard math library is
       available by command line option.  If requested, the math  library  is
       defined  before  processing  any  files.  bc starts by processing code
       from all the files listed on the command line  in  the  order  listed.
       After all files have been processed, bc reads from the standard input.
       All code is executed as it is read.  (If a file contains a command  to
       halt the processor, bc will never read from the standard input.)
.......

   OPTIONS
       -h, --help
              Print the usage and exit.

       -i, --interactive
              Force interactive mode.
.......

   VARIABLES
       There  are  four  special  variables,  scale,  ibase, obase, and last.
       scale defines how some operations use digits after the decimal  point.
       The default value of scale is 0. ibase and obase define the conversion
       base for input and output numbers.  The default  for  both  input  and
       output  is  base  10.   last (an extension) is a variable that has the
       value of the last printed number.  These will be discussed in  further
       detail  where  appropriate.   All  of  these variables may have values
       assigned to them as well as used in expressions.
.......

       - expr The result is the negation of the expression.

       ++ var The  variable  is  incremented  by one and the new value is the
              result of the expression.

       -- var The variable is decremented by one and the  new  value  is  the
              result of the expression.

       var ++
               The  result of the expression is the value of the variable and
              then the variable is incremented by one.

       var -- The result of the expression is the value of the  variable  and
              then the variable is decremented by one.

       expr + expr
              The result of the expression is the sum of the two expressions.
.......

AUTHOR
       Philip A. Nelson
       philnelson@acm.org

ACKNOWLEDGEMENTS
       The author would like to thank Steve  Sommars  (Steve.Sommars@att.com)
       for his extensive help in testing the implementation.  Many great sug‐
       gestions were given.  This  is  a  much  better  product  due  to  his
       involvement.

GNU Project                       2006-06-11                            bc(1)

这个 man 是比较详细的数据,在该画面中,你可以使用底下的按钮来移动屏幕显示整份文档的位置:

  • [enter]:向文档后面移动一行
  • [PageUp]/[PageDown]:向文档前/后移动一页
  • 方向键上/下:向文档前/后移动一行
  • g:移动到整份文档的第一行
  • G:移动到整份文档的最后一行
  • q:离开 man page

有兴趣的话,读者们可以自己慢慢的阅读 man page。如果是短时间要查找重要的项目,例如我们需要调整输出的小数点位数 (scale) 时, 可以『跑到整份文档的第一行,然后输入斜线 / ,输入关键字』之后 man page 就可以自动帮你找关键字。

  • /keyword:命令 man page 找到关键字
  • n:向整份文档的下方继续找关键字
  • N:向整份文档的上方继续找关键字
例题:
  1. 在 bc 的运行环境中,让 1/3 可以输出 .3333 这样的格式
  2. 以 man bc 当中,找关键字『 pi= 』,然后在 bc 的环境中,算出 pi 的 50 位数结果。
  3. 在 bc 的环境下,算出 1000/17 的『余数 (remainder)』
  4. 在 man date 的环境下,找到第一个范例 (Examples),并说明该指令的意义为何?

man page 除了上述的功能之外,其实 man page 的第一行也显示了该指令/文件的功能,例如 BC(1) 代表的是 1 号 man page, 而共有 9 种左右的 man page 号码,其意义为:

代号代表内容
1用户在shell环境中可以操作的指令或可运行档
2系统内核可调用的函数与工具等
3一些常用的函数(function)与函数库(library),大部分为C的函数库(libc)
4设备文件的说明,通常在/dev下的文件
5设置档或者是某些文件的格式
6游戏(games)
7惯例与协定等,例如Linux文件系统、网络协定、ASCII code等等的说明
8系统管理员可用的管理指令
9跟kernel有关的文档

上述的表格内容可以使用『man man』来更详细的取得说明。通过这张表格的说明, 未来你如果使用man page在察看某些数据时,就会知道该指令/文件所代表的基本意义是什么了。

例题:
我们知道 passwd 有两个地方存在,一个是设置档 /etc/passwd,一个是变更密码的指令 /usr/bin/passwd, 如何分别查找两个数据的 man page 呢?

2.1.6:管线命令的应用

从前几小节的练习中,有时候我们会发现几件事情:(1)指令输出的数据量常常很大,一个屏幕装不下,连使用[shift]+[pageup] 都没有办法全部看完; (2)在 man bc 时,找那个 pi= 的项目中,范例提到在文本界面下,可以通过某些方式不要进入 bc 去算 pi !

尤其是第 2 个项目,里面就谈到那个 | 的符号,这个符号我们称作『管线 (pipe) 』! 它的目的是『将前一个指令输出的数据,交由后面的指令来处理』的意思~我们来谈谈该指令的意义:

[student@localhost ~]$ echo "scale=10; 4*a(1)" | bc -l

如果你将上面的指令分成两部份来看,第一部份先运行『echo "scale=10; 4*a(1)"』,就可以发现从屏幕上输出『 scale=10; 4*a(1) 』的字样,echo 这个指令很单纯的将后续的数据当成文本消息输出到屏幕上。 这些数据之后被带入到 bc 指令中,亦即直接在 bc 的环境中进行 scale=10; 4*a(1) 的运算之意。

有两个指令很常使用于大量数据输出时的片段展示,那就是 more 与 less。more 会一页一页翻动,但是无法向前回去查找之前的画面。 至于 less 就是 man page 的操作环境。

例题:
  1. 分别通过 more 与 less 将 ll /etc 的结果一页一页翻动;
  2. 承上,尝试找到 passwd 相关字样的文件名结果
  3. 使用 find /etc 的指令,但是将结果交给 less 来查找
  4. 承上,若使用的身份为 student 时,能否找到错误消息呢?
  5. 通过管线的功能,计算出一年 365 天共有几秒钟?
Tips 鸟哥 并不是所有的指令都支持管线命令的,例如之前谈到的 ls, ll, find 或本章稍晚会提到的 cp, mkdir 等指令。 能够支持管线 | 的指令,就被称为管线命令。

除了使用 | less 的功能加上斜线 (/) 找到关键字的方法之外,我们也可以通过 grep 来取得关键字! 以上头的例题来看,如果要使用 ll /etc/ 找出 passwd 的关键字『那一行』的话,可以简单的这样做:

[student@localhost ~]$ ll /etc/ | grep 'passwd'
例题:
  1. 以 ifconfig 指令来观察系统的所有适配器 IP
  2. 使用管线命令搭配 grep 取得关键字,来取出有 IP 的那行消息即可。

2.2:Linux 文件管理初探

在 Linux 的系统下,总是会需要用到文件管理的情况发生,包括创建目录与文件、拷贝与移动文件、删除文件与目录等等。 另外,读者也应该要知道在 Linux 的系统下,那些目录是正规系统会存在的,以及该目录又应该要放置哪些数据等等。

2.2.1:Linux 目录树系统简介

所有的 Linux distribions 理论上都应该要遵循当初 Linux 开发时所规范的各项标准,其中之一就是文件系统的阶层标准 (Filesystem Hierarchy Standard, FHS)。基本上 FHS 只是一个基本建议值,详细的数据还是保有让各个 distribution 自由设计的权力! 无论如何,FHS 还是规范了根目录与 /usr, /var 这三个目录内应该要放置的数据就是了。

CentOS 7 的目录规范与以前的 CentOS 6 差异颇大,详细的数据还请参考相关文档,底下仅就个别目录中应该要放置的数据做个基本的解释。 请自行『 ll / 』对照下表的相关目录说明。

目录名称应放置文件内容(一定要知道的内容)
/bin
/sbin
/bin 主要放置一般用户可操作的指令
/sbin 主要放置系统管理员可操作的指令
这两个数据目前都是链接档,分别链接到 /usr/bin, /usr/sbin 当中
/boot 与开机有关的文件,包括内核文件 / 开机管理程序与设置档
/dev 是 device 的缩写,放置设备档,包括硬盘档、键盘鼠标终端机文件等
/etc 一堆系统设置档,包括帐号、密码与各式服务软件的设置档大多在此目录内
/home
/root
/home 是一般帐号的家目录缺省放置位置
/root 则是系统管理员的家目录了!
/lib
/lib64
系统函数库与内核函数库,其中 /lib 包含内核驱动程序,而其他软件的函数库若为 64 比特,则使用 /lib64 目录内的函数库文件。 这两个目录目前也都是链接到 /usr/lib, /usr/lib64 内。
/proc 将内存内的数据做成文件类型,放置于这个目录下,连同某些内核参数也能手动调整
/sys 跟 /proc 类似,只是比较针对硬件相关的参数方面。
/usr 是 usr 不是 user 喔!是 unix software resource 的缩写,与 Unix 程序有关。从 CentOS 7 开始, 系统相关的所有软件、服务等,均放置在这个目录中了!因此不能与根目录分离。
/var 是一些变动数据,系统运作过程中的服务数据、暂存数据、登录数据等等。
/tmp 一些用户操作过程中会激活的暂存盘,例如 X 软件相关的数据等等。

Linux 是由工程师开发的,许多的目录也沿用 Unix 的规范,Unix 也是工程师开发的,所以许多的目录命名通常就与该目录要放置的数据有点相关性。 例如 bin, sbin 就类似 binary, system binary (二进位程序、系统管理二进位程序) 来结合这样~

目录名称应放置文件内容(以后用到就知道了)
/media
/mnt
/media 主要是系统上临时挂载使用的设备(如随插即用 USB)之惯用目录
/mnt 主要是用户或管理员自行暂时手动挂载的目录
/opt /opt 是 optional 的意思,通常是第三方协力厂商所开发的软件放置处
/run 系统进行服务软件运作管理的功能,CentOS 7以后,这个目录也放在内存当中了!
/srv 通常是给各类服务 (service) 放置数据使用的目录

另外,在 Linux 环境下,所有的目录都是根目录 (/) 衍生出来的,从根目录开始撰写的文件名也就被称为『绝对路径』。 而磁盘规划方面,若需要了解磁盘与目录树的搭配,可以使用 df (display filesystem) 的软件来查阅:

[student@localhost ~]$ df
文件系统                 1K-区段    已用    可用 已用% 挂载点
/dev/mapper/centos-root 10475520 4024880 6450640   39% /
devtmpfs                 1008980       0 1008980    0% /dev
tmpfs                    1024480      96 1024384    1% /dev/shm
tmpfs                    1024480    8988 1015492    1% /run
tmpfs                    1024480       0 1024480    0% /sys/fs/cgroup
/dev/vda2                2086912  150216 1936696    8% /boot
/dev/mapper/centos-home  3135488   41368 3094120    2% /home
tmpfs                     204900      20  204880    1% /run/user/1000

上表中最左侧为文件系统,最右侧则是挂载点。挂载点有点类似 windows 系统的 C:, D:, E: 等磁盘槽的意思。 在 Linux 底下所有的文件都是从目录树分出来,因此文件系统也需要跟目录结合在一起。以上表来说,『当你进入 /boot 这个目录时, 就可以看到 /dev/vda2 这个设备的内容』之意。

此外,系统也已经将内存仿真成文件系统,提供用户将暂存数据放置于高速的内存内。只是这些数据在关机后就会消失。 这些目录包括很重要的 /dev/shm (上表)。

例题:
  1. 使用 ll / 观察文件名,在出现的画面中,『链接档』与『一般目录』的差别中,最左边的字符分别是什么?
  2. /proc 与 /sys 的文件容量分别有多大?为什么?
  3. /boot/vmlinuz 开头的文件名为系统的『内核文件』,找出来 CentOS 7 的环境下,这个内核文件容量有多大?
  4. 使用 man ls 及 man ifconfig 两个指令查找完毕后,猜测 ls 与 ifconfig 『可能』放置在哪些目录内?
  5. 如果你有一个暂时使用的文件需要经常访问,且文件容量相当大,为了加速,你可以将这个文件暂时放置于哪里来做编辑? 只是编辑完毕后必须要重新拷贝回原本的目录去。

2.2.2:工作目录的切换与相对/绝对路径

缺省的情况下,用户取得 shell 的环境时,通常就是在自己的『家目录』,例如 windows 文件总管打开后, 出现在画面中的,通常是『我的文档夹』之类的环境。若要变更『工作目录』,例如变更工作目录到 /var/spool/mail 去,可以这样做:

[student@localhost ~]$ ls
下载  公共  图片  视频  文档  桌面  模板  音乐
[student@localhost ~]$ cd /var/spool/mail
[student@localhost mail]$ ls
root  rpc  student 

如上所示,一开始读者会在 student 家目录下,因此单纯使用 ls 时,会列出工作目录 (家目录) 底下的数据,亦即是一堆中文文件名的目录存在。 而当读者操作『 cd /var/spool/mail 』之后,工作目录会变成该目录,所以提示字符里面也将 ~ 变成了 mail 了。因此使用 ls 所列出的工作目录下的数据, 就会有不一样的文件名出现。读者在操作指令时,要特别注意『工作目录』才行。而列出目前工作目录的方法为使用 pwd:

[student@localhost mail]$ pwd
/var/spool/mail
[student@localhost mail]$ 

读者操作系统时,不要只看提示字符下的文件名,最好能够查阅实际的目录较佳。如下案例:

[student@localhost mail]$ cd /etc
[student@localhost etc]$ pwd
/etc
[student@localhost etc]$ cd /usr/local/etc
[student@localhost etc]$ pwd
/usr/local/etc
[student@localhost etc]$ 

操作者可发现,自从进到 /etc 之后,提示字符内的目录位置一直是『 etc 』,然而使用 pwd 就能够发现两者的差异。 这在系统管理时非常的重要,若去错目录,会导致文件修订的错误!

除了根目录与家目录之外,Linux 上有一些比较特别的目录需要记忆:

目录名称目录意义
/ 根目录,从根目录写起的文件名只会存在一个
~ 用户的家目录,不同用户的家目录均不相同
. 一个小数点,代表的是『本目录』,亦即目前的工作目录之意
.. 两个小数点,代表的是『上一层目录』
- 一个减号,代表『上一次的工作目录』之意

操作者应该要注意,根据文件名写法的不同,也可将所谓的路径(path)定义为绝对路径(absolute)与相对路径(relative)。 这两种文件名/路径的写法依据是这样的:

  • 绝对路径:由根目录(/)开始写起的文件名或目录名称, 例如 /home/student/.bashrc;
  • 相对路径:相对于目前路径的文件名写法。 例如 ./home/student 或 ../../home/student/ 等等。开头不是 / 就属于相对路径的写法
例题:
  1. 前往 /var/spool/mail 并观察当下的工作目录
  2. 观察上一层目录的文件名数据,查找一下有没有『 anacron 』这个文件名存在?
  3. 请前往『上一层目录的那个 anacron 目录』
  4. 在当下的目录中,如何查找 /var/log 这个目录的内容?分别使用两种方式 (相对/绝对路径) 来查阅
  5. 回到 student 家目录
  6. 分别使用『缺省』、『相对路径』、『绝对路径』、『工作目录底下』运行 ifconfig 的方法

2.2.3:简易文件管理练习

由本章的说明,读者可以清楚 /etc 与 /boot 为两个相当重要的目录,其中 /etc 更是需要备份的所在。 若读者使用 student 的身份来暂时进行文件管理行为时,例如将 /etc 完整备份时,可以如何进行?

  1. 先前往 /dev/shm 这个内存仿真的目录来操作后续指令:
    [student@localhost ~]$ cd /dev/shm
    [student@localhost shm]$ 
    
  2. 创建一个名为 backup 的目录,等待备份数据:
    [student@localhost shm]$ mkdir backup
    [student@localhost shm]$ ll
    drwxrwxr-x. 2 student student       40  4月 26 21:32 backup
    -rwx------. 1 gdm     gdm     67108904  4月 26 17:48 pulse-shm-1013772778
    -rwx------. 1 student student 67108904  4月 26 17:49 pulse-shm-1217036117
    .......
    
  3. 进入 backup 目录当中:
    [student@localhost shm]$ cd backup
    [student@localhost backup]$ pwd
    /dev/shm/backup
    
  4. 将 /etc 完整的拷贝过来:
    [student@localhost backup]$ cp /etc .
    cp: 略过 ‘/etc’ 目录
    
    因为 cp 会自动忽略目录的拷贝,因此需要如下的指令来拷贝目录才行
  5. 开始拷贝目录 (-r) 的动作:
    [student@localhost backup]$ cp -r /etc .
    cp: 无法打开 ‘/etc/crypttab’ 来读取数据: 拒绝不符权限的操作
    cp: 无法访问 ‘/etc/pki/CA/private’: 拒绝不符权限的操作
    cp: 无法访问 ‘/etc/pki/rsyslog’: 拒绝不符权限的操作
    .......
    
    因为系统很多保密的文件是不许被一般用户所读取的,因此 student 许多文件无法顺利拷贝也是正确的!操作者无须担心。
  6. 再次拷贝文件,同时将错误消息发送到垃圾桶,不要显示在屏幕上:
    [student@localhost backup]$ cp -r /etc . 2> /dev/null
    [student@localhost backup]$ ll -d /etc ./etc
    drwxr-xr-x. 129 root    root    8192  4月 26 19:11 /etc
    drwxr-xr-x. 129 student student 4960  4月 26 21:41 ./etc
    

通过上面的练习,最终我们知道其实 student 身份拷贝的 /dev/shm/backup/etc 是没有完整的备份的!因为两者的容量大小、 内容文件、权限都不相同之故。至于相关的指令功能、选项功能等等,请自由 man cp、 man mkdir 来预先了解。

另外,在一些错误消息要丢弃的环境中,也可以在指令的最后面加上 2> /dev/null 来将错误的数据导向垃圾桶 (/dev/null)。

例题:
  1. 先查看一下有没有 /dev/shm/backup/etc/passwd* 的文件名存在?
  2. 拷贝使用 cp 而删除可以使用 rm。尝试删除前一题的文件名,并确认该文件已经不存在了。
  3. 查看一下 /dev/shm/backup/etc/X11 是『文件』还是『目录』?
  4. 如何删除前一题谈到的目录?
  5. 若想要删除 /dev/shm/backup/etc/xdg 这个目录,且『每个文件删除前均须询问』,须加上哪个选项?

2.3:课后练习操作

前置动作:请使用 unit02 的硬盘进入作业环境,并请先以 root 身分运行 vbird_book_setup_ip 指令设置好你的学号与 IP 之后,再开始底下的作业练习。

  • 简答题:请使用 student 的身份登录系统,然后在应用程序中找寻一个名为 gedit 的指令,打开该软件之后,依据底下的题目写下答案。 保存时,请选择文件名为 /home/student/ans02.txt (建议写下答案前,均在系统上面实验过才好。)
    1. (a)甚么指令可以切换语系成为 en_US.utf8,并且(b)如何确认语系为正确设置了;
    2. Linux 的日期设置其实与 Unix 相同,都是从 1970/01/01 开始计算时间而来。若有一个密码数据,该数据告诉你密码修改的日期是在 16849,请问如何使用 date 这个指令计算出该日期其实是西元年月日?(写下完整指令)
    3. 用 cal 输出 2016/04/29 这一天的月历与直接看到该日为星期几?(写下完整指令)
    4. 承上,当天是这一年当中由 1 月 1 日算起来的第几天? (注:该日期称为 julian date),(a)写下完整指令与(b)运行结果显示第几天
    5. 若为 root 的身份,使用 su - student 切换成为 student 时,需不需要输入密码?
    6. 调用出 HOME 这个变量的指令为何?
    7. 使用那一个指令可以查出 /etc/group 这个文件的第三个字段意义为何?(写下指令)
    8. 请查出 /dev/null 这个设备的意义为何?(写下指令)
    9. 如何通过管线命令与 grep 的功能,通过 find /etc 找出文件名含有 passwd 的文件名数据?(a)写下指令与(b)运行结果的文件名有哪几个?
    10. 承上,将一堆错误消息丢弃,我只需要显示正确的文件名而已。(写下指令)
    11. 根目录下,那两个目录主要在放置用户与管理员常用的指令?
    12. 根目录下,那两个目录其实是内存内的数据,本身并不占硬盘空间?
    13. 根目录下,那一个目录主要在放置设置档?
    14. 上网找出, /lib/modules/ 这个目录的内容主要在放置什么东西?
    15. 有个指令名称为 /usr/bin/mount,请使用『绝对路径』与『工作目录下的指令』来运行该指令
  • 实作题:直接在系统上面操作,操作成功即可,无须写下任何答案
    1. 使用 student 身分,在自己的家目录底下,创建名为 ./20xx/unit02 的目录
    2. 使用 student 身分,将 /etc/X11 这个数据拷贝到上述的目录内
    3. 使用 root 的身分,删除 /opt/myunit02 文件名。
    4. 使用 root 的身分,创建名为 /mnt/myunit02 目录
    5. 使用 root 的身分,通过 find /etc 指令,找出文件名含有 passwd 的文件数据,并将这些文件数据拷贝到 /mnt/myunit02 去。

作业结果传输:请以 root 的身分运行 vbird_book_check_unit 指令上传作业结果。 正常运行完毕的结果应会出现【XXXXXX;aa:bb:cc:dd:ee:ff;unitNN】字样。若需要查阅自己上传数据的时间, 请在操作系统上面使用: http://192.168.251.250 检查相对应的课程文件。

修改历史:
  • 2016/04/26:无论如何,就是练习的机会多!记得每个指令都要学会操作!并了解为何要这么做!
  • 2017/03/05:修改了课后习题,并与云端系统互相搭配处理了。
2016/04/26以来统计人数
计数器
其他链接
环境工程模式篇
鸟园讨论区
鸟哥旧站

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