回顾:

         FHS,命令及bash命令历史

                   FHS:

                            /bin,/sbin, /lib, /lib64, /etc

                            /home,/root

                            /boot

                            /media,/mnt

                            /proc,/sys

                            /tmp

                            /srv

                            /opt

                            /dev

                            /usr

                                     bin,sbin,lib,lib64,share,local,include,....

                            /var

                                     cache,lib,log....

                   命令:which,whereis,who,w,alias,unalias

                   命令历史:history

         一个程序是由4个文件组成:

         二进制文件,配置文件,库文件,帮助文件

二进制文件存放在:/bin       /sbin

库文件存放在:/lib        /lib64

配置文件存放在:/etc

帮助文件存放在:/usr/

 

bash的基础特性:

 

         命令补全:

shell程序在接收到用户执行命令的请求,分析完成之后,最左侧的字符串会被当做命令

 

         命令处理机制:

                  查找内部命令

         根据PATH环境变量中设定的目标,自左而右逐个搜索目录下的文件名,找到与命令名称相同的文件后,就将其发起为一个进程。

命令补全操作:

         给定的打头字符串如果能唯一标识某命令程序文件,则直接补全,不能唯一标识的某命令程序文件,再击一次tab键一次,会给出列表。

路径补全:

         与命令补全的机制不完全一样,根据给定的起始路径补全。

 

目录管理类的命令:

         mkdir,rmdir

                   mkdir:       make directory

         语法:mkdir[OPTION]... DIRECTORY...

目录有基名basename)与目录名dirname)之分,

注意:路径基名才是命令的操作对象。基名之前的路径名必须存在。

         选项:                      

                  -p:    创建嵌套的多层子目录

                   -v:     verbos,详细显示命令的执行过程

                   -pv常结合使用

                   -mMODE:   直接给定权限(mode是用户在创建目录时指定的权限,不指定则默                                                认权限,mode就是选项参数)

 

         rmdir

                   全称:removeempty directory      //删除空目录(empty:空的)

                   注意:rmdir只能删除空目录

                   语法:rmdir[OPTION]... DIRECTORY...

                   选项:

                            -p:    删除某目录后,如果其父目录为空,则一并删除。

                            -v:     显示执行过程

问题一:如何创建 /tmp/x/y1, /tmp/x/y2, /tmp/x/y1/a, /tmp/x/y1/b ?

问题二:如何创建/a/d,/ a/c,/ b/d,/ b/c

上面的这两个问题,引出bash命令行的展开。

 

bash的基础特性之一:命令行展开

         ~:自动展开为用户的家目录,或指定的用户的家目录;

         {}:可承载一个以逗号分隔的路径列表,并能够将其展开为多个路径;

                   例如:/tmp/{a,b}相当于  /tmp/a /tmp/b

创建目录完成后,可以用tree命令查看,tree命令需要安装,可以用rpm安装,也可以用yum安装

解决上面的两个问题:

问题一:

         mkdir-pv /tmp/x/{y1/{a,b},y2}

演示:

[root@localhost Packages]# mkdir -pv /tmp/x/{y1/{a,b},y2}

mkdir: created directory `/tmp/x'

mkdir: created directory `/tmp/x/y1'

mkdir: created directory `/tmp/x/y1/a'

mkdir: created directory `/tmp/x/y1/b'

mkdir: created directory `/tmp/x/y2'

[root@localhost Packages]# tree /tmp/x

/tmp/x

├── y1

   ├── a

   └── b

└── y2

 

问题二:

         mkdir-pv /{a,b}/{c,d}

演示:

[root@localhost Packages]# tree /{a,b}

/a

├── c

└── d

/b

├── c

└── d

问题三:创建如下目录结构:(使用命令行的展开方式创建)

         /tmp/mysysroot/

                   bin

                   sbin

                   etc

                            sysconfig

                                    network-scripts

                   usr

                            bin

                            sbin

                            local

                                     bin

                                     sbin

                                     etc

                                     lib

                            lib

                            lib64

                   var

                            cache

                            log

                            run

 

 

tree命令:

         treetree - listcontents of directories in a tree-like format.(翻译:树状目录的格式列表内容)

         tree           //不跟选项,单独执行tree,显示当前目录结构

选项:

         -d             List directories only.(翻译:只列出目录)

         -L level          Maxdisplay depth of the directory tree.(翻译:最大显示目录树的深度)                                          指定显示目录的层级,不指定level,则全部显示

         举例:tree  -L 2  /tmp     //只显示出两层目录

 

 

 

 

bash的基础特性——命令的执行状态结果

        

         命令执行的状态结果:

                   bash通过状态返回值来输出此结果

                            成功:0

                            失败:1-255

                   命令执行完成之后,其状态返回值保存于bash的特殊变量$?

注意:命令的执行状态结果保存在变量$?中,要获取的时候,在命令执行完后就要立即获取,不能中间再执行命令,这个变量只能保存一个命令的执行状态结果,并且只能获取最近的执行命令的结果。

演示:

[root@localhost ~]# ls

anaconda-ks.cfg  Desktop   Downloads   install.log.syslog  Pictures  Templates

core.10718       Documents  install.log Music               Public   Videos

[root@localhost ~]# echo $?

0

[root@localhost ~]# ls adfadf

ls: cannot access adfadf: No such file ordirectory

[root@localhost ~]# echo $?

2

[root@localhost ~]#

命令正常执行时,有的还会有命令返回值,根据命令及其功能不同,结果各不相同。

 

引用命令的执行结果:

         $(COMMAND)               `COMMAND`   //``是反引号

举例:要创建一个以创建时间为名称的目录:

wKioL1gcHavAVDNLAAFQ9Ao6LqY371.png

命令引用是非常重要的。

 

bash基础特性——引用

         强引用:         '        '

         弱引用:         "       "

         命令引用:     `        `   $()

 

bash基础特性——快捷键

         ctrl+a:      跳转至命令行首

         ctrl+e:      跳转至命令行尾

         ctrl+u:      删除命令行首到光标处之间的字符    

         ctrl+k:       删除命令行尾到光标后之间的字符

         ctrl+l:        等同于clear清屏

 

文件查看类命令:

         cat,tac, head, tail, more, less

        

         cat

演示操作:

         [root@localhost~]# cat/etc/rc.d/init.d/functions

         [root@localhost~]# cat -n/etc/rc.d/init.d/functions

        

         分屏查看命令

                   moreless

         more

                   [root@localhost~]# more /etc/rc.d/init.d/functions

         more查看文件内容时,在文件的左下角会显示显示文件百分之多少内容

                   wKioL1gcHcbTi1JrAAAyUl1AGHk628.png

         查看more显示的文件的操作命令:

                   空格:        向下翻屏,但是more翻到文件尾部后,就退出阅读了,不能再往前翻屏                              了。无需使用q退出,但是也可以使用q直接退出

                   b:               向上翻屏

         less

                   [root@localhost~]# less /etc/rc.d/init.d/functions

         less命令其实就是man 命令调用的,man手册页查看时的操作,就是less的操作。

 

head命令:

         查看文件的前n

         语法:

                   head[OPTION]... [FILE]...

         head默认查看文件的前10

         选项:

                   -n#-#        想查看文件的指定的前#

演示:

[root@localhost ~]# head -n 5 /etc/rc.d/init.d/functions

# -*-Shell-script-*-

#

# functions       Thisfile contains functions to be used by most or all

#                shellscripts in the /etc/init.d directory.

#

[root@localhost ~]# head -5 /etc/rc.d/init.d/functions           //functions:函数

# -*-Shell-script-*-

#

# functions       Thisfile contains functions to be used by most or all

#                shellscripts in the /etc/init.d directory.

#

[root@localhost ~]#

 

 

tail命令:

         查看文件的后n

         语法:

                   tail[OPTION]... [FILE]...

         选项:

         -n# -#:       查看文件的指定的后#

         -f:                        查看文件尾部内容结束后不退出,跟踪显示新增的行

演示:

[root@localhost ~]# tail -n 20 -f /etc/rc.d/init.d/functions

结束跟踪,用命令ctrl+c

注意:这个tail -f 这个选项命令,在以后人工监控日志更新时,是非常有用的。

 

stat命令:

         displayfile or file system status(翻译:显示文件或文件系统的状态)

         语法:

                   stat[OPTION]... FILE...

         stat的选项很少用,我们记住stat后加文件就可以。

         statFILE            //file是指定的文件

[root@localhost ~]# stat/etc/rc.d/init.d/functions

 File: `/etc/rc.d/init.d/functions'

 Size: 25430              Blocks: 56         IO Block: 4096   regular file

Device: 802h/2050d         Inode: 1706481    Links: 1

Access: (0644/-rw-r--r--)  Uid: (   0/    root)   Gid: (   0/    root)

Access:2016-09-21 21:09:15.014999428 -0400

Modify:2016-09-21 21:09:15.012999479 -0400

spacer.gifChange: 2016-09-21 21:09:15.012999479 -0400

[root@localhost ~]#

 

                                                                 stat命令中,最重要的就是关心这三个文件的时间戳

        

 

 

 

 

每一个文件,都有两类数据:

         元数据:metadata

         数据:     data

                   元数据是文件的相关属性,名称,大小....

                   数据就是文件真实内容了。

 

Access:2016-09-21 21:09:15.014999428 -0400             //最近访问时间,即打开文件的时间

Modify:2016-09-21 21:09:15.012999479 -0400              //最近更改时间,是文件数据改变

Change:2016-09-21 21:09:15.012999479 -0400             //最近改动时间,是文件的元数据改变

注意:文件的更改时间发生变化,则文件改动时间一定发生变化,因为,更改时间,对应的是文件的内容,当文件内容发生变化时,可能文件的大小就会发生变化,而改动时间是对应文件的元数据,那改动时间就一定会发生变化。

上面的三个时间戳,被简写成:atime(访问), mtime(更改), ctime(改动).

文件的三个时间戳是可以手动改动的,

更改时间戳,就是用命令,touch

 

touch命令:

touch - change file timestamps(翻译:更改文件的时间戳)

         语法:

                   touch[OPTION]... FILE...

当用touch单独执行更新一个已经存在的文件的时间戳时,不加任何选项,则文件的三个时间戳都会被改变。

演示:

         wKiom1gcHe7xWFXwAAHIn7Owoz8451.png

第二种情况,当我们用touch一个不存在文件时,则会创建该文件

演示:

         [root@localhost~]# cd hello/

         [root@localhosthello]# ls

         [root@localhosthello]# touch myfile

         [root@localhosthello]# ls

         myfile                                   //显示创建了一个新的文件。

         [root@localhosthello]# file myfile

         myfile:empty                     //空文件

         [root@localhosthello]#

         创建一个文件名带有空格的文件:(就需要用到转义字符)

[root@localhost hello]# ls

myfile

[root@localhost hello]# touch a b

[root@localhost hello]# ls

a b  myfile

[root@localhost hello]# touch c\ d

[root@localhost hello]# ls

a b  c d  myfile

[root@localhost hello]#

        

 

选项

         -c:     --no-create, do not create any files表示:文件存在则更新时间戳,文件不存在则不                                                                                                           进行创建动作。

         -a:    仅修改access times

         -m:   仅修改modify times

         -tSTAMPSTAMP的格式:[[CC]YY]MMDDhhmm[.ss]):手动指定更新的时间戳。

演示:

[root@localhost hello]# stat myfile

 File: `myfile'

 Size: 0                  Blocks: 0          IO Block: 4096   regular empty file

Device: 802h/2050d         Inode: 2364574    Links: 1

Access: (0644/-rw-r--r--)  Uid: (   0/    root)   Gid: (   0/    root)

Access: 2016-09-21 21:42:54.206998481 -0400

Modify: 2016-09-21 21:42:54.206998481 -0400

Change: 2016-09-21 21:42:54.206998481 -0400

[root@localhost hello]# touch -m -t 0209171200.56 myfile

[root@localhost hello]# stat myfile

 File: `myfile'

 Size: 0                  Blocks: 0          IO Block: 4096   regular empty file

Device: 802h/2050d         Inode: 2364574    Links: 1

Access: (0644/-rw-r--r--)  Uid: (   0/    root)   Gid: (   0/    root)

Access: 2016-09-21 21:42:54.206998481 -0400

Modify: 2002-09-17 12:00:56.000000000 -0400

Change: 2016-09-21 21:58:22.401998303 -0400

[root@localhost hello]#

注意:change time是不能手动更改的。