文章目录
- 前言
- 1. which
- 2. whereis
- 3. locate
- 4. find
- 总结:
前言
之前在弄交叉编译的时候需要找到gcc,gdb什么的在哪里;涉及到了查找文件指令。
这里对linux中的查找指令进行总结
1. which
which指令一般用来寻找可执行文件的路径,比如我们使用的ifconfig
,ls
这种可执行文件指令所在的地方。
which 默认是找 PATH 内所规范的目录,所以如果我们的可执行文件的命令没有在PATH
里面,那使用which无法查到。
这里举几个例子:
输入which ifconfig
指令
输出/sbin/ifconfig
输入which history
指令
提示/usr/bin/which: no history in (/usr/local/sbin:/usr/local/bin:/sbin:/bin: /usr/sbin:/usr/bin:/root/bin)
这里是因为history是bash内置的指令,并不在PATH中,这也侧面说明which默认是找PATH内所规范的目录。
2. whereis
whereis指令可谓好评如潮,因为相对于find指令,这个指令用起来并没有find那么太复杂,并且速度比find要快很多。
那为何搜寻的速度会比 find 快这么多? 是因为 whereis 只找几个特定的目录而已,并没有全系统去查询之故。所以说,whereis 主要是针对 /bin /sbin 下面的可执行文件, 以及 /usr/share/man 下面的 man page 文件,跟几个比较特定的目录来处理而已。所以速度当然快的多!
whereis的一般用法如下:
whereis option 文件或目录名
选项与参数option:
-l :可以列出 whereis 会去查询的几个主要目录而已
-b :只找 binary 格式的文件
-m :只找在说明文档 manual 路径下的文件
-s :只找 source 来源文件
-u :搜寻不在上述三个项目当中的其他特殊文件
举例:
whereis ifconfig
ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz
3. locate
locate也是查找的指令,只不过它需要根据系统的数据库进行查找,数据库内数据更新时间的新旧会影响到查找的结果。
因此这个东西还是有使用上的限制。你会发现使用 locate 来寻找数据的时候特别的快, 这是因为 locate 寻找的数据是由“已创建的数据库 /var/lib/mlocate/” 里面的数据所搜寻到的,所以不用直接在去硬盘当中存取数据,因此非常快。
因为他是经由数据库来搜寻的,而数据库的创建默认是在每天执行一次 ,所以当你新创建起来的文件, 却还在数据库更新之前搜寻该文件,那么 locate 会告诉你“找不到!”,所以必须要更新数据库呀。
手动更新数据库,直接输入“ updatedb ”就可以了。 updatedb 指令会去读取 /etc/updatedb.conf 这个配置文件的设置,然后再去硬盘里面进行搜寻文件名的动作, 最后就更新整个数据库文件啰!因为 updatedb 会去搜寻硬盘,所以当你执行 updatedb 时,可能会等待数分钟的时间。
指令说明:
updatedb:
根据 /etc/updatedb.conf 的设置去搜寻系统硬盘内的文件名,并更新 /var/lib/mlocate 内的数据库文件;
locate:
依据 /var/lib/mlocate 内的数据库记载,找出使用者输入的关键字文件名。
locate一般用法:locate option keyword
选项与参数:
-i :忽略大小写的差异;
-c :不输出文件名,仅计算找到的文件数量
-l :仅输出几行的意思,例如输出五行则是 -l 5
-S :输出 locate 所使用的数据库文件的相关信息,包括该数据库纪录的文件/目录数量等
-r :后面可接正则表达式的显示方式
举例:
找出系统中所有与 passwd 相关的文件名,且只列出 5 个
[root@ubuntu ~]# locate -l 5 passwd
/etc/passwd
/etc/passwd-
/etc/pam.d/passwd
/etc/security/opasswd
/usr/bin/gpasswd
4. find
find的功能非常强大,但是速度比较慢,因为它涉及到了很多参数
find用法:find [PATH] [option] [action]
选项与参数:
与时间有关
的选项:共有 -atime, -ctime 与 -mtime ,以 -mtime 说明
-mtime n :n 为数字,意义为在 n 天之前的“一天之内”被更动过内容的文件;
-mtime +n :列出在 n 天之前(不含 n 天本身)被更动过内容的文件文件名;
-mtime -n :列出在 n 天之内(含 n 天本身)被更动过内容的文件文件名。
-newer file :file 为一个存在的文件,列出比 file 还要新的文件文件名
举例:
寻找 /etc 下面的文件,如果文件日期比 /etc/passwd 新就列出
[root@ubuntu~]# find /etc -newer /etc/passwd
-newer 用在分辨两个文件之间的新旧关系
与使用者或群组名称有关
的参数:
-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 搜寻。
举例:
搜寻 /home 下面属于 pi的文件
[root@ubuntu~]# find /home -user pi
#这个东西也很有用的~当我们要找出任何一个使用者在系统当中的所有文件时,
#就可以利用这个指令将属于某个使用者的所有文件都找出来
与文件权限及名称有关
的参数:
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 :
搜寻文件权限“刚好等于” 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… 的属性存在!
举例:
找出文件名为 passwd 这个文件
[root@ubuntu~]# find / -name passwd
找出文件名包含了 passwd 这个关键字的文件
[root@ubuntu~]# find / -name “passwd”
#利用这个 -name 可以搜寻文件名,默认是完整文件名,如果想要找关键字,
#可以使用类似 * 的任意字符来处理
找出 /run 目录下,文件类型为 Socket 的文件名有哪些?
[root@ubuntu~]# find /run -type s
#这个 -type 的属性也很有帮助喔!尤其是要找出那些怪异的文件,
#例如 socket 与 FIFO 文件,可以用 find /run -type p 或 -type s 来找!
搜寻文件当中含有 SGID 或 SUID 或 SBIT 的属性
[root@ubuntu~]# find / -perm /7000
#所谓的 7000 就是 —s–s–t ,那么只要含有 s 或 t 的就列出,所以当然要使用 /7000,
#使用 -7000 表示要同时含有 —s–s–t 的所有三个权限。而只需要任意一个,就是 /7000
额外可进行的动作:
-exec command :command 为其他指令,-exec 后面可再接额外的指令来处理搜寻到的结果。
-print :将结果打印到屏幕上,这个动作是默认动作!
举例说明:
将上个范例找到的文件使用 ls -l 列出来~
[root@ubuntu~]# find /usr/bin /usr/sbin -perm /7000 -exec ls -l {} ;
#注意到,那个 -exec 后面的 ls -l 就是额外的指令,指令不支持命令别名,
#所以仅能使用 ls -l 不可以使用 ll
找出系统中,大于 1MB 的文件
[root@ubuntu~]# find / -size +1M
{} 代表的是“由 find 找到的内容”,如上图所示,find 的结果会被放置到 {} 位置中;
-exec 一直到 ; 是关键字,代表 find 额外动作的开始 (-exec) 到结束 (;) ,在这中间的就是 find 指令内的额外动作。 在本例中就是“ ls -l {} ”
因为“ ; ”在 bash 环境下是有特殊意义的,因此利用反斜线来跳脱。
总结:
这篇文章大体都是以书上为主,个人见解较少,因为实际运用中find暂时用的还不多,都是用whereis来替代,或者使用图形化界面来查找。