6.5.1 指令文件名的搜寻
在终端机模式当中,连续输入两次[tab]按键就能够知道使用者有多少指令可以下达。
which (寻找“可执行文件”)
这个指令是根据“PATH”这个环境变量所规范的路径,去搜寻“可执行文件”的文件名。所以,重点是找出“可执行文件”而已!且 which 后面接的是“完整文件名”。若加上 -a 选项,则可以列出所有的可以找到的同名可执行文件,而非仅显示第一个而已。
6.5.2 文件文件名的搜寻
whereis (由一些特定的目录中寻找文件文件名)
whereis可以加入选项来找寻相关的数据,例如,如果你要找可可执行文件(binary),那么加上-b就可以。如果不加任何选项的话,那么就将所有的数据列出来。
whereis主要是针对/bin/sbin下面的可执行文件,以及 /usr/share/man 下面的 man page 文件,跟几个比较特定的目录来处理而已。
locate / updatedb
locate的使用很简单,直接在后面输入“文件的部分名称”后,就能够得到结果。如上面,输入locate passwd,那么在完整文件名(包括路径名称)当中,只要有passwd在其中,就会被显示出来。这也是很方便好用的指令,如果忘记某个文件完整文件名时。
现使用 locate 来寻找数据的时候特别的快, 这是因为 locate 寻找的数据是由“已创建的数据库 /var/lib/mlocate/” 里面的数据所搜寻到的,所以不用直接在去硬盘当中存取数据。
直接输入“updatedb”可以手动更新数据库。updatedb指令会去读取/etc/updatedb.conf这个配置文件的设置,然后再去硬盘里面进行文件名的动作,最后就更新整个数据库文件。因为updatedb会去搜寻硬盘,所以当你执行updatedb时,可能会等待数分钟的时间。
updatedb:根据 /etc/updatedb.conf 的设置去搜寻系统硬盘内的文件名,并更新/var/lib/mlocate 内的数据库文件;
locate:依据 /var/lib/mlocate 内的数据库记载,找出使用者输入的关键字文件名。
find
图中最右边为目前的时间,越往左边则代表越早之前的时间轴啦。由图 6.5.1 我们可以清楚的知道:
+4代表大于等于5天前的文件名:ex> find /var -mtime +4
-4代表小于等于4天内的文件文件名:ex> find /var -mtime -4
4则是代表4-5那一天的文件文件名:ex> find /var -mtime 4
-nouser 或 -nogroup 的选项功能中,除了你自行由网络上面下载文件时会发生之外, 如果你将系统里面某个帐号删除了,但是该帐号已经在系统内创建很多文件时,就可能会发生无主孤魂的文件存在! 此时你就得使用这个 -nouser 来找出该类型的文件。
SUID 与 SGID 都可以设置在二进制程序上,假设我想要找出来 /usr/bin, /usr/sbin 这两个目录下, 只要具有 SUID 或 SGID 就列出来该文件,你可以这样做:
因为 SUID 是 4 分,SGID 2 分,总共为 6 分,因此可用 /6000 来处理这个权限! 至于 find后面可以接多个目录来进行搜寻!另外, find 本来就会搜寻次目录,这个特色也要特别注意。
find 的特殊功能就是能够进行额外的动作(action)。我们将范例八的例子以图解来说明如下:
该范例中特殊的地方有 {} 以及 \; 还有 -exec 这个关键字,这些东西的意义为:
{} 代表的是“由 find 找到的内容”,如上图所示,find 的结果会被放置到 {} 位置中;
-exec 一直到 \; 是关键字,代表 find 额外动作的开始 (-exec) 到结束 (\;) ,在这中间的就是 find 指令内的额外动作。 在本例中就是“ ls -l {} ”。
因为“ ; ”在 bash 环境下是有特殊意义的,因此利用反斜线来跳脱。
如果要找的文件是具有特殊属性的,例如SUID、文件拥有者、文件大小等,那么利用locate是没有办法搜寻的,此时find就很重要。另外,find还可以利用万用字符来找寻文件名。想要找出/etc下面文件名包含httqd的文件,那么就可以这样:
不但可以指定搜寻的目录(连同次目录),并且可以利用额外的选项与参数来找到最正确的文件名。使用find比较废硬盘,所以尽量不要用find,尽量用whereis和locate。