回顾:
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命令:
tree:tree - 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` //``是反引号
举例:要创建一个以创建时间为名称的目录:
命令引用是非常重要的。
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
分屏查看命令:
more和less
more
[root@localhost~]# more /etc/rc.d/init.d/functions
more查看文件内容时,在文件的左下角会显示显示文件百分之多少内容
查看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
Change: 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单独执行更新一个已经存在的文件的时间戳时,不加任何选项,则文件的三个时间戳都会被改变。
演示:
第二种情况,当我们用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
-tSTAMP(STAMP的格式:[[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是不能手动更改的。