Linux学习之路——目录
https://blog.csdn.net/sugar_star/article/details/91350251
上节内容:chmod、chown、chgrp、umask
本节内容:find、locate、which、whereis、grep
四、文件搜索命令
1.find
find命令能够根据给的条件在指定目录下搜索文件,其选项有:
-name: 根据文件名搜索
-iname: 不区分大小写
-inum: 根据识别号搜索
-type: 根据文件类型搜索
-size: 根据文件大小搜索
-user: 根据所有者搜索
-group: 根据所属组搜索
-amin: access,根据访问时间搜索
-cmin: change,根据修改属性时间搜索
-mmin: modify,根据修改内容时间搜索
-a: all,同时满足两个搜索条件
-o: or,满足两个搜索条件中的一个
-exec/-ok: 对搜索结果执行操作
(1)-name
和windows中的根据文件名进行模糊搜索不同,Linux中是根据文件名进行精准搜索,如搜索empty,则搜索到的一定是名为empty的文件,而不会是aempty,emptyb、Empty等文件。
现在输入find /etc -name init,搜索一下etc目录下名为init的文件:
看起来find命令很不方便,但-name选项是能够配合正则表达式使用的,这里介绍两个常用的正则表达:
*: 匹配任意数量的不定字符
?: 匹配一个不定字符
搜索etc目录下文件名中包含init的文件:
搜索etc目录下文件名以init为开头的文件:
搜索etc目录下文件名为init后跟3个字符的文件:
当报错路径必须在表达式之前时,可以尝试切到其他目录再使用find目录,或使用转移字符“\”。
(2)-iname
现在我们在etc目录下创建一个名为INITTAB的文件,并输入find /etc -iname init???:
(3)-inum
记得在讲ln命令时,在tmp目录下创建了issue文件的硬链接和软链接,其中硬链接和原文件的识别号是一样的。现在我们用ls命令查看一下它们的识别号具体是什么:
我们就根据其识别号进行搜索,输入find /tmp -inum 522243:
可以看到find命令将issue文件及其硬链接都搜索了出来。
(4)-type
我们在讲ls -l命令时曾说过,文件属性中f代表文件,d代表目录,l代表链接。现在查看一下tmp目录下有哪些:
白色的是文件,蓝色的是目录,青色的是链接。
使用-type选项搜索文件、目录、链接:
(5)-size
在size命令下:
+number: 大于
-number: 小于
=number: 等于
在find命令以数据块作为文件大小的搜索单位(就很烦),而1个数据块 = 512B = 0.5KB,所以假设我们要查找大于100MB的文件,就等于查找大于102400KB,即204800个数据块的文件。
输入find / -size +204800,搜索/目录下中大于100MB的文件:
可以看到此时只有两个大于100MB的文件,报错的那些是因为这几个文件大小经常变化,所以这些报错是正常的,不用管。
(6)-user和-group
我们先查看一下tmp目录下文件的详细信息:
使用-user搜索所有者是root的文件:
使用-group搜索所属组是sugar的文件:
(7)-amin、-cmin和-mmin
上图的搜索结果表示:
五分钟内访问过的文件有: /tmp/gongsi
五分钟内文件属性被修改过的文件有: /tmp/gongsi和/tmp/empty
五分钟内没有文件内容被修改
(8)-a与-o
输入find /tmp -user sugar -a -group root,搜索tmp目录下所有者是sugar且所属组是root的文件:
-o选项留给读者自行实验。
(9)-exec/-ok
-exec和-ok选项是可以相互替换的,区别在于-ok选项回在搜索结果中询问哪一个才是所搜索的目标,而-exec选项会将符合条件的文件或目录全显示出来
使用这两个选项能够对搜索到的文件进行操作
输入find /tmp -name is* -a -type l -exec ls -l {} \;
来查看tmp目录下文件名是is开头且文件类型是链接的文件的详细信息:
其中命令末尾的{} \;
是-exec/-ok的固定格式,详细情况以后再介绍,这里会用就可以。
2.locate
locate命令和find命令一样,都是搜索文件的命令,其区别在于:
find命令时在指定的目录下进行实时遍历来搜索文件;
locate命令是在一个定期更新的资料库里搜索要寻找的文件;
因此locate命令的搜索速度比find命令快很多。其选项有
-i: 搜索时不区分大小写
分别运行find /etc -iname inittab;locate -i inittab:
可以看到locate命令搜索到了etc目录下的inittab和INITTAB文件及另外的两个文件。
那么locate命令的资料库在哪儿呢?我们可以直接输入locate locate
命令看一下:
注意到有一个/var/lib/mlocate/mlocate.db文件,这个就是locate命令的资料库了。
虽然locate命令能很快地得到搜索结果,但它有两个受限的地方。
(1)
locate命令的资料库是定期更新的,而不是即时的。
现在用locate命令搜索一下install.log文件:
可以看到搜索结果很快就出来了。那么现在我们在root目录下创建一个名为install.bak的新文件,再用locate搜索一下这个文件:
注意到root目录下已经有了install.bak文件,但locate命令却没有搜索到,这就是因为资料库并没有马上收录install.bak文件。
针对这一点除了等系统本身定期更新快,我们还可以使用updatebd命令让资料库进行更新:
这次locate命令就将install.bak文件搜索出来了。
(2)
locate只会在资料库里进行搜索,而资料库并不是对所有范围内的文件都进行收录的。
我们经常使用到的tmp目录是个临时目录,不在资料库的收录范围内,所以不管资料库再怎么更新,locate命令都是搜索不到tmp目录下任何文件的。
3.which和whereis
(1)which
which命令能够显示命令本身所在的目录和别名信息。
输入which ls,查看ls命令的信息:
可以看到ls命令又叫ls --color=auto,所在路径是/bin/ls。不管是ls,ls --color=auto还是/bin/ls,它们产生的效果几乎都是一样的:
但有的命令会产生细微的不同,比如rm命令,我们先用which命令查看一下rm命令:
rm命令又叫rm -i,其所在路径是/bin/rm,我们分别运行一下试试:
注意到rm和rm -i命令效果是一样的,都会询问是否删除,而/bin/rm则没有。
(2)whereis
whereis命令能显示命令所在目录及其帮助文档路径。
我们使用whereis命令搜索一下ls命令:
whereis命令显示ls命令的所在目录是/bin/ls,其帮助文档在share目录下的两个位置(绝大部分命令的帮助文档都在/usr/share目录下;这里的man不是男人的意思,而是manual的man)。
4.grep
grep命令能够在文件中搜索字符匹配的行并显示,其选项有:
-i: 不区分大小写
-v: 排除指定字串
我们先使用less命令查看一下/etc/inittab文件的内容:
现在使用grep命令在inittab文件中搜索multiuser所在行:
我们之前说过,用#号开头的都是注释,输入grep -v ^# /etc/iniitab(这里的 ^# 是指以#号为行首的意思,因为有的注释是写在有效行的后面),查看除去注释后的内容:
可以看到inittab文件中只有一行是有效的。
若想将行中含有#的都去掉,只需将#用’'引起来,即grep -v ‘#’ 文件名。