type
status
date
slug
summary
tags
category
icon
password
指令文件名的搜寻
在终端机模式当中,连续输入两次[tab]按键就能够知道使用者有多少指令可以下达。
怎么知道这些指令的完整文件名放在哪里? 就通过 which 或 type来找寻吧!
which (寻找“可执行文件”)
这个指令是根据“PATH”这个环境变量所规范的路径,去搜寻“可执行文件”的文件名~ 所以,重点是找出“可执行文件”而已!且 which 后面接的是“完整文件名”喔!若加上 -a 选项,则可以列出所有的可以找到的同名可执行文件,而非仅显示第一个而已!
usage: which [option] command
-a :将所有由 PATH 目录中可以找到的指令均列出,而不止第一个被找到的指令名称
有趣的范例
用which找不到history,因为history是“bash内置的指令”, 但是 which 默认是找 PATH 内所规范的目录,所以当然一定找不到的啊(有bash 就有 history!)!那怎办?没关系!我们可以通过 type 这个指令喔! 关于 type 的用法我们将在第十章的 bash 再来谈!
文件文件名的搜寻
文件文件名搜寻指令:find、whereis、locate。
通常 find 不很常用的!因为速度慢之外, 也很操硬盘!一般我们都是先使用 whereis 或者是 locate 来检查,如果真的找不到了,才以find 来搜寻呦! 为什么呢?因为 whereis 只找系统中某些特定目录下面的文件而已,locate 则是利用数据库来搜寻文件名,当然两者就相当的快速, 并且没有实际的搜寻硬盘内的文件系统状态,比较省时间啦!
whereis
由一些特定的目录中寻找文件文件名。
usage: whereis [-bmsu] 文件或目录名
选项与参数:
- l :可以列出 whereis 会去查询的几个主要目录而已
- b :只找 binary 格式的文件
- m :只找在说明文档 manual 路径下的文件
- s :只找 source 来源文件
- u :搜寻不在上述三个项目当中的其他特殊文件
相比直接搜寻磁盘的find,whereis就相当好用,另外whereis只找几个特定的目录,并不会全磁盘搜索。whereis主要针对/bin,/sbin下的可执行文件,以及/usr/share/man 下面的 man page 文件,跟几个比较特定的目录来处理而已。所以速度当然快的多!
想要知道 whereis 到底查了多少目录?可以使用 whereis -l 来确认一下即可!
locate / updatedb
usage: locate [-ir] keyword
选项与参数:
- i :忽略大小写的差异;
- c :不输出文件名,仅计算找到的文件数量
- l :仅输出几行的意思,例如输出五行则是 -l 5
- S :输出 locate 所使用的数据库文件的相关信息,包括该数据库纪录的文件/目录数量等
- r :后面可接正则表达式的显示方式

locate 的使用更简单,直接在后面输入“文件的部分名称”后,就能够得到结果。 举上面的例子来说,我输入 locate passwd ,那么在完整文件名 (包含路径名称) 当中,只要有 passwd 在其中, 就会被显示出来的!这也是个很方便好用的指令,如果你忘记某个文件的完整文件名时~~
但是,这个东西还是有使用上的限制呦!为什么呢?你会发现使用 locate 来寻找数据的时候特别的快,这是因为 locate 寻找的数据是由“已创建的数据库 /var/lib/mlocate/” 里面的数据所搜寻到的,所以不用直接在去硬盘当中存取数据,呵呵!当然是很快速啰!
那么有什么限制呢?就是因为他是经由数据库来搜寻的,而数据库的创建默认是在每天执行一次 (每个distribution 都不同,CentOS 7.x 是每天更新数据库一次!),所以当你新创建起来的文件, 却还在数据库更新之前搜寻该文件,那么 locate 会告诉你“找不到!因为必须要更新数据库呀!
那能否手动更新数据库哪?当然可以啊!更新 locate 数据库的方法非常简单,直接输入“ updatedb”就可以了! updatedb 指令会去读取 /etc/updatedb.conf 这个配置文件的设置,然后再去硬盘里面进行搜寻文件名的动作, 最后就更新整个数据库文件啰!因为 updatedb 会去搜寻硬盘,所以当你执行updatedb 时,可能会等待数分钟的时间喔!
- updatedb:根据 /etc/updatedb.conf 的设置去搜寻系统硬盘内的文件名,并更新/var/lib/mlocate 内的数据库文件;
- locate:依据 /var/lib/mlocate 内的数据库记载,找出使用者输入的关键字文件名。
find
usage: find [PATH] [option] [action]
选项与参数:
1.与时间有关的选项:
共有 -atime, -ctime 与 -mtime ,以 -mtime 说明
- mtime n :n 为数字,意义为在 n 天之前的“一天之内”被更动过内容的文件;
- mtime +n :列出在 n 天之前(不含 n 天本身)被更动过内容的文件文件名;
- mtime -n :列出在 n 天之内(含 n 天本身)被更动过内容的文件文件名。
- newer file :file 为一个存在的文件,列出日期比 file 还要新的文件文件名

2. 与使用者或群组名称有关的参数:
- uid n :n 为数字,这个数字是使用者的帐号 ID,亦即 UID ,这个 UID 是记录在/etc/passwd 里面与帐号名称对应的数字。这方面我们会在第四篇介绍。
- gid n :n 为数字,这个数字是群组名称的 ID,亦即 GID,这个 GID 记录在/etc/group,相关的介绍我们会第四篇说明~
- user name :name 为使用者帐号名称喔!例如 dmtsai
- group name:name 为群组名称喔,例如 users ;
- nouser :寻找文件的拥有者不存在 /etc/passwd 的人!
- nogroup :寻找文件的拥有群组不存在于 /etc/group 的文件!
- 当你自行安装软件时,很可能该软件的属性当中并没有文件拥有者,
- 这是可能的!在这个时候,就可以使用 -nouser 与 -nogroup 搜寻。

- user让我们可以找出任何使用者在系统下创建的东西。对于-nouser和-nogroup,除了自己再网上下载的东西可能出现无owner(user)和无group外,当使用者被删除,但它在系统里创建的东西人如果没被删除,也会变成孤魂游鬼,没有使用者和群组归属哦,此时就要用-nouser来找出了。
3. 与文件权限及名称有关的参数:
- name filename:搜寻文件名称为 filename 的文件;
- size [+-]SIZE:搜寻比 SIZE 还要大(+)或小(-)的文件。这个 SIZE 的规格有:c: 代表 Byte, k: 代表 1024Bytes。所以,要找比 50KB还要大的文件,就是“ -size +50k ”
- type TYPE :搜寻文件的类型为 TYPE 的,类型主要有:一般正规文件 (f), 设备文件 (b, c),目录 (d), 链接文件 (l), socket (s), 及 FIFO (p) 等属性。
- perm mode :"perm" 是 "permission" 的缩写,表示权限或许可。搜寻文件权限“刚好等于” mode 的文件,这个 mode 为类似 chmod的属性值,举例来说, -rwsr-xr-x 的属性为 4755 !
- perm -mode :搜寻文件权限“必须要全部囊括 mode 的权限”的文件,举例来说,我们要搜寻 -rwxr--r-- ,亦即 0744 的文件,使用 -perm -0744,当一个文件的权限为 -rwsr-xr-x ,亦即 4755 时,也会被列出来,因为 -rwsr-xr-x 的属性已经囊括了 -rwxr--r-- 的属性了。
- perm /mode :搜寻文件权限“包含任一 mode 的权限”的文件,举例来说,我们搜寻-rwxr-xr-x ,亦即 -perm /755 时,但一个文件属性为 -rw-------也会被列出来,因为他有 -rw.... 的属性存在!

上述范例中比较有趣的就属 -perm 这个选项啦!"perm" 是 "permission" 的缩写,表示权限或许可。他的重点在找出特殊权限的文件啰! 我们知道 SUID 与SGID 都可以设置在二进制程序上,假设我想要找出来 /usr/bin, /usr/sbin 这两个目录下, 只要具有SUID 或 SGID 就列出来该文件,你可以这样做:
因为 SUID 是 4 分,SGID 2 分,总共为 6 分,因此可用 /6000 来处理这个权限! 至于 find 后面可以接多个目录来进行搜寻!另外, find 本来就会搜寻次目录,这个特色也要特别注意喔!
- size的例子,学习到区间式限定大小
- 找出 /etc 下面,文件大小介于 50K 到 60K 之间的文件,并且将权限完整的列出 (ls -l):find /etc-size +50k -a -size -60k -exec ls -l {} \;
注意到 -a ,那个 -a 是 and 的意思,为符合两者才算成功
- 找出 /etc 下面,文件大小大于 50K 且文件所属人不是 root 的文件名,且将权限完整的列出 (ls -l);
find /etc -size +50k -a ! -user root -exec ls -ld {} \;
find /etc -size +50k -a ! -user root -type f -exec ls -l {} \;
上面两式均可!注意到 ! ,那个 ! 代表的是反向选择,亦即“不是后面的项目”之意!找出 /etc 下面,容量大于 1500K 以及容量等于 0 的文件:find /etc -size +1500k -o -size 0相对于 -a ,那个 -o 就是或 (or) 的意思啰!
4. 额外可进行的动作:
- exec command :command 为其他指令,-exec 后面可再接额外的指令来处理搜寻到的结果。
- print :将结果打印到屏幕上,这个动作是默认动作!
范例:将上个范例找到的文件使用 ls -l 列出来~
[root@study ~]# find /usr/bin /usr/sbin -perm /7000 -exec ls -l {} \;
# 注意到,那个 -exec 后面的 ls -l 就是额外的指令,指令不支持命令别名,所以仅能使用 ls -l 不可以使用 ll 喔!注意注意!

find的优势
如果你要找的文件是具有特殊属性的,例如 SUID 、文件拥有者、文件大小等等, 那么利用 locate 是没有办法达成你的搜寻的!此时 find 就显的很重要啦! 另外,find 还可以利用通配符来找寻文件名呢!并且可以利用额外的选项与参数来找到最正确的文件名!
find的劣势
find 在寻找数据的时后相当的操硬盘!速度慢!所以没事情不要使用 find 啦!有更棒的指令可以取代呦!那就是上面提到的 whereis 与 locate 啰