本篇文章接这篇文章,内容皆总结摘抄自《鸟哥的Linux私房菜:基础学习篇》,仅作笔记。
查看文件内容的命令
- cat
cat的全拼为concatenate(连接),该命令从第一行开始连续打印文件内容。命令使用格式为:cat -option 文件。选项说明如下表:
选项 | 说明 |
---|---|
-b | 列出行号,但空白行不标行号 |
-E | 将结尾的换行符$显示出来 |
-n | 打印行号,且空白行也会有行号 |
-T | 将tab键以^I显示 |
-v | 列出一些看不出来的特殊字符 |
-A | 相当于-vET的整合选项 |
使用cat命令打印/etc/issue文件:
- tac
tac从名字上看是cat的反向表示,事实上它的功能也是cat命令的反向显示,即将内容从最后一行到第一行反向显示在屏幕上。例如使用tac打印/etc/issue文件:
- nl
nl命令与cat命令相比更注重行号的显示。其选项和参数如下表:
选项 | 说明 |
---|---|
-b | 指定行号是否显示的方式,主要包括两种方式:①-b t:不显示空行行号,默认选项;②-b a:列出空行行号。 |
-n | 列出行号显示方式,主要包括三种:①-n ln:行号在屏幕的最左方显示;②-n rn:在栏位的最右方显示,且不加0;③-n rz:在栏位的最右方显示,且加0。 |
-w | 行号栏位的占用的字符数 |
以上介绍的命令都是将文件直接全部打印到屏幕上,对于内容比较多的文件使用上述命令就不方便查看内容了,这时我们可以使用more和less命令。
- more
使用more命令查看文件时如果文件内容大于屏幕输出的行数,就会在屏幕最后一行显示当前屏幕输出占用文件内容的百分比。例如使用more命令查看/etc/mail.rc文件,打印如下:
可以看到我们其实是进入了more命令的环境,在此环境中,我们可以使用下面的按键:
按键 | 功能 |
---|---|
空格键 | 向下翻一页 |
Enter | 向下翻一页 |
/字符串 | 在当前显示内容中,向下查找关键词“字符串” |
:f | 立刻显示出文件名以及目前显示的行数 |
q | 离开more命令环境 |
b | 往回翻页,对管道无用 |
- less
less命令的使用比more命令更有弹性,使用less命令可以向前向后翻页以及向前向后查找。在less命令环境中,可以使用以下按键:
按键 | 功能 |
---|---|
空格 | 向下翻一页 |
pagedown | 向下翻一页 |
pageup | 向上翻一页 |
/字符串 | 上下查找字符串 |
?字符串 | 向上查找字符串 |
n | 重复前一个查找 |
N | 反向的重复前一个查找 |
g | 前进到这个数据的第一行 |
G | 前进到这个数据的最后一行 |
q | 离开less环境 |
在有些场景下我们可能只需要查看文件的头部或者尾部的内容(例如日志),尤其对于需要查看文件尾部内容的场景来说,如果文件太大使用上面任意某个命令都不太好看,此时我们就可以使用文件查看的数据截取命令head和tail。
- head
head命令的功能是显示文件的前几行。使用格式:head [-n number] 文件,例如显示/etc/mail.rc文件的前5行使用命令head -n5 /etc/mail.rc:
head命令也可以不使用-n选项,这时默认显示文件的前十行。
- tail
tail命令的功能是显示文件的后几行。使用格式:tail [-nf number] 文件,例如显示/etc/mail.rc文件的后5行使用命令tail -n5 /etc/mail.rc:
但tail命令比head命令多了-f选项,-f选项的功能与-n选项类似,但使用-f选项时会进入特定环境中,该文件新增的内容会实时打印到屏幕上,知道使用ctrl+c退出环境。
修改文件时间或创建新文件
每个文件在Linux中都会记录许多的时间参数,在这些时间参数中有三个主要的变动时间,如下:
- 修改时间(modification time,mtime):当该文件的内容数据变更时,就会更新这个时间。此处的内容数据指的是文件的内容,而不是文件的属性或权限。
- 状态时间(status time,ctime):当该文件的状态改变时,就会更新这个时间。例如当文件的权限或属性被更改时该时间就会更新。
- 读取时间(access time,atime):当文件的eircom被读取时,就会更新这个时间。例如我们使用cat命令读取某个文件的,就会更新该时间。
例如我们使用命令 date;ll /etc/mail.rc ;ll --time=atime /etc/mail.rc ;ll --time=ctime /etc/mail.rc 来分别查看当前时间、修改时间(Linux默认显示的就是修改时间)、读取时间和状态时间如下:
默认情况下(即不使用--time选项时)显示的就是mtime,并且我们也无法使用--time来指定mtime,因为Linux会告诉你--time的合法值只有atime和ctime。
我们可以使用touch命令来修改文件的时间,touch命令的使用格式为:touch [-options] 文件。当touch命令指定的文件不存在时还会创建该文件。选项以及说明如下表:
选项 | 说明 |
---|---|
-a | 自定义acces time |
-c | 修改文件的时间,如果文件不存在则不建立新文件 |
-d | 后面接自定义的日期,也可以用--date=日期或时间 |
-m | 修改mtime |
-t | 接自定义的时间,格式为YYYYMMDDhhmm |
首先我们可以使用touch命令来创建一个空的文件,例如使用touch test命令创建文件名为test的空文件:
使用date和ll命令可以看到test文件的修改时间、状态时间和读取时间都为创建时间。
这时我们使用cat命令查看test文件后再重新查看test时间,发现atime更新为查看时间:
文件与目录的默认权限
当我们创建一个文件或目录的时候,该文件或目录都会有默认权限,而默认权限与umask有关。umask是指定目前用户在简历文件或目录时的权限默认值。我们可以使用两种方式来查看当前用户新建文件或目录时的默认权限。第一种是使用umask -S命令,该命令以符号类型的方式显示默认权限,例如下面就表示当前用户创建的文件或目录的默认权限为:rwxr-xr-x。
另一种方式是直接使用umask命令,与上面执行umask -S同一个用户执行umask命令得到以下结果:
如果看过笔者前面的文章大概可以猜到这里的显示跟文件权限的数字表示有关(4-读权限,2-写权限,1-执行权限。这三个权限数字的和为某个角色的全部权限),但这里其实仍然很难让人看懂。首先权限应该只有三个数字,这里有四个;其次我们知道最大权限是777,这里是0022,难道三个角色都没有读和执行的权限?事实上,这四个数字的第一个表示的是特殊权限,本文后面会介绍特殊权限因此此处按下不表。而后面三个数字确实对应的是我们了解的拥有者、用户组和其他人的权限,但是是他们的权限中需要减掉的权限。
另外,文件和目录的默认权限不是一样的。笔者在之前的文章中介绍过,一般文件的x权限指的是该文件是否可执行,而目录的x权限指的是是否可进入该目录。对于一般的文件来说是不需要也无法执行的,因此建立文件默认没有x权限;对于一般的目录来说需要有进入目录的权限,因此建立目录默认有x权限。因此可以得出一下结论:
- 建立文件的默认权限最大为666,即-rw-rw-rw-;
- 建立目录的默认权限最大为777,即drwxrwxrwx。
我们知道了文件和目录默认的最大权限,又知道了建立文件和目录时默认减去的权限(umask),就很容易可以得出新建文件和目录时的默认权限:
- 文件默认权限 = 文件默认最大权限 - umask,即(-rw-rw-rw-) - (-----w--w-)= -rw-r--r--。最终权限为:owner=读写权限,group=读权限,other=读权限;
- 目录默认权限 = 目录默认最大权限 - umask,即(drwxrwxrwx) - (d----w--w-) = drwxr-xr-x。注意别把d给减去了,d表示当前文件属性是目录。最终权限为:owner=读写以及进入目录权限,group=读权限以及进入目录权限,other=读权限以及进入目录权限。
为了验证以上结论,首先新建一个文件,查看文件权限如下图,与我们得到的结论一致。
再新建一个目录,查看目录权限如下图,与我们得到的结论一致。
查找脚本文件
我们可以通过which命令来查找某个命令的完整的文件名,此命令是根据PATH环境遍历所规范的路径,去查找执行文件的文件名。它只有一个-a选项,-a选项将PATH目录中所有找到的命令都列出来而不是只列出第一个。例如我们使用which查找ls命令的完整文件名:
查找一般文件
- whereis
whereis命令在一些特定的目录中查找文件,提供了几个选项来查找特定类型的文件。使用格式为:whereis [-bmsu] 文件或目录名。提供的选项以及说明如下表:
选项 | 说明 |
---|---|
-l | 列出whereis命令查询的几个主要目录 |
-b | 只查找binary二进制格式的文件 |
-m | 只查找在说明文件manual路径下的文件 |
-s | 只查找source源文件 |
-u | 查找不在上述三种类型中的其他特殊文件 |
需要注意的是,whereis命令查找的只是某些特定目录下的文件。要想知道特定目录包括哪些目录只需要执行whereis -l命令即可,例如下面是笔者的whereis -l命令输出结果,只截取了部分结果。
- locate
locate命令可以根据部分文件名称来查找文件,利用已建立的数据库/var/lib/mlocate/里面的数据查到的,不需要在硬盘中读取数据。使用格式为:locate [-options] keyword。相关选项及说明如下表:
选项 | 说明 |
---|---|
-i | 忽略大小写差异 |
-c | 不输出文件名,仅计算找到的文件数量 |
-l | 仅输出几行,后面需要跟一个数字,例如 -l 10 |
-S | 输出locate所使用的数据库文件的相关信息,包括该数据库记录的文件/目录数量等 |
-r | 后面可接正则表达式 |
例如使用locate -i命令来查询关键词为“var”的文件:
错误信息显示没有数据文件,因此无法使用locate命令查找。这时我们可以使用updatedb命令来更新/建立该数据库文件,更新之后再使用locate命令就可以查找成功了。
- find
find命令是一个很强大但速度较慢的查询命令。强大是因为它几乎可以满足各种类型的查找,不同于whereis命令只能在特定目录下查找,也不同于locate命令只能根据部分文件名称查找;慢则是由于find命令是在全系统查找,且是直接查找硬盘。find命令的使用格式为:find [PATH] [option] [action],可以搭配几种类型的选项来使用,例如时间选项、用户选项、文件选项等,下面逐一介绍。
find命令使用时间选项时可以查找指定时间类型的指定时间的文件,这里的时间类型指的是之前介绍过的三个时间,即修改时间选项-mtime、读取时间选项-atime以及状态时间选项-ctime。这三种选项的使用方式是一致的,此处使用-mtime举例,可以像下面使用:
- -mtime n:在n天之前的一天之内被修改过内容的文件;
- -mtime +n:列出在n天之前(不含n天)被修改过内容的文件;
- -mtime -n:列出在n天之内(含天)被修改过内容的文件。
例如查看10天前的那一天/usr目录下被读取的过的文件列表可以使用命令find /usr -atime 10:
find命令使用用户选项时可以查找属于某类用户或不属于某类用户的文件,相应的用户选项以及参数如下表:
选项及参数 | 说明 |
---|---|
-uid n | n为使用者的账号id,即uid,记录在/etc/passwd中 |
-gid n | n为用户组的id,即gid,记录在/etc/group中 |
-user name | namer为使用者账号名称 |
-nouser | 查找文件的拥有者不在/etc/passwd中的文件 |
-group name | name为用户组名称 |
-nogroup | 查找文件的用户组不存在于/etc/group种的文件 |
例如想要查看/usr目录下属于用户root的文件可以使用find /usr -user root命令。
find命令使用文件选项时可以根据文件权限以及文件大小等来查找文件。相应的选项以及参数如下表:
选项及参数 | 说明 |
---|---|
-name filename | 根据文件名来查找文件 |
-size [+-] SIZE | 查找比较指定的SIZE大或者小的文件,例如想查找比50k小的文件可以使用 -size -50k |
-type TYPE | 根据文件类型查找文件。文件类型包括:一般文件(f),设备文件(b,c),目录(d),链接文件(l),socket(s),FIFO(p)等 |
-perm mode | 查找文件权限等于mode的文件 |
-perm -mode | 查找文件权限全部囊括了mode的文件 |
-perm /mode | 查找文件权限包含了任一mode的权限 |