Linux 命令之 which whereis locate find

0、概述

  • which:在PATH变量指定的路径中,搜索与指定名字匹配的 系统命令的位置,并且返回第一个搜索结果。
  • whereis:搜索与指定名字匹配的 二进制文件、源文件和帮助手册文件所在的路径。二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s)。如果省略参数,则返回所有信息。在数据库中查询。
  • locate:locate 会给出所有与*filename* 相匹配的文件的路径。在数据库中查询。
  • find:实际搜寻硬盘查询文件名称。
  • whatis:展示命令手册页面描述里的内容
    使用 mkwhatis 命令可将当前系统上所有的帮助手册及与之对应的关键字创建为一个数据库。

1、which

语法:which [-a] cmdname1 cmdname2 ......

作用:从环境变量 PATH 中,定位/返回与指定名字相匹配的 命令/可执行文件 所在的路径。

原理:执行 which 命令时,which 会在当前环境变量PATH中依次寻找能够匹配所找命令名字的可执行文件名,不加-a选项,返回第一个匹配的可执行文件的路径,否则依次返回满足条件的所有可执行文件的路径名。

适用场合:一般用于查找 命令/可执行文件 所在的路径。有时候可能在多个路径下存在相同的命令,该命令可用于查找当前所执行的命令到底是哪一个位置处的命令。例如:

1
2
[fenglepeng@centos]# which passwd 
/usr/bin/passwd

2、whereis

语法:

1
2
3
4
5
6
7
whereis [-bmsu] 文件或者目录名称

选项
-b:只找二进制文件。
-m:只找在说明文件manual路径下的文件。
-s:只找source源文件。
-u:没有说明文档的文件。

作用:定位/返回与指定名字匹配的二进制文件、源文件和帮助手册文件所在的路径。

原理:whereis 命令首先会去掉 filename 中的前缀空格和以.开头的任何字符,然后再在数据库(var/lib/slocate/slocate.db)中查找与上述处理后的filename相匹配的二进制文件、源文件和帮助手册文件,使用之前可以使用updatedb命令手动更新数据库。

适用场合:二进制文件、源文件和帮助手册文件路径的查找。例如:

1
2
3
4
5
6
7
# 将和passwd文件相关的文件都查找出来
[fenglepeng@centos]# whereis passwd
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz

# 只将二进制文件查找出来
[fenglepeng@centos]# whereis -b passwd
passwd: /usr/bin/passwd /etc/passwd

和find相比,whereis查找的速度非常快,这是因为 linux系统会将系统内的所有文件都记录在一个数据库文件中,当使用 whereis 和 locate 时,会从数据库中查找数据,而不是像find命令那样,通过遍历硬盘来查找,效率自然会很高。

但是该数据库文件并不是实时更新,默认情况下每天更新一次,因此,我们在用whereis和locate查找文件时,有时会找到已经被删除的数据,或者刚刚建立文件,却无法查找到,原因就是因为数据库文件没有被更新。(使用updatedb命令进行更新)

3、locate

语法:locate 文件或者目录名称

作用:同 whereis 指令一样,也是从数据库建立的索引中查找,不同的是该命令查找所有部分匹配的文件,使用之前可以使用 updatedb 命令手动更新数据库。

原理:默认情况下(当filename中不包含通配符*),locate会给出所有与*filename* 相匹配的文件的路径。

适用场合:没有文件类型性质的模糊查找(你只记得某个文件的部分名称)。

1
2
3
4
5
6
7
8
9
10
11
[fenglepeng@centos]# locate passwd
/lib/security/pam_unix_passwd.so
/lib/security/pam_passwdqc.so
/usr/include/rpcsvc/yppasswd.x
/usr/include/rpcsvc/yppasswd.h
/usr/lib/perl5/5.8.5/i386-linux-thread-multi/rpcsvc/yppasswd.ph
/usr/lib/kde3/kded_kpasswdserver.la
/usr/lib/kde3/kded_kpasswdserver.so
/usr/bin/vncpasswd
/usr/bin/userpasswd
/usr/bin/yppasswd

4、 find

语法:

1
2
3
4
5
find 路径 -options [-print -exec -ok ...]

-print:find命令将匹配的文件输出到标准输出。
-exec:find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为`command { } ;`,注意`{ }``;` 之间的空格。
-ok:和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行
  1. 时间查找参数:
    • -atime n:将 n*24 小时内存取过的的文件列出来。
    • -ctime n:将 n*24 小时内改变、新增的文件或者目录列出来。
    • -mtime n:将 n*24 小时内修改过的文件或者目录列出来。
    • -newer file:把比file还要新的文件列出来。
  2. 名称查找参数:
    • -gid n:寻找群组ID为n的文件。
    • -group name:寻找群组名称为name的文件。
    • -uid n:寻找拥有者ID为n的文件。
    • -user name:寻找用户者名称为name的文件。
    • -name file:寻找文件名为file的文件(可以使用通配符)。
  3. -type:查找某一类型的文件:
    • b:块设备文件。
    • d:目录。
    • c:字符设备文件。
    • l:符号链接文件。
    • p:管道文件。
    • f:普通文件。
  4. -size:按大小查找:
    • -size +512k:大小大于 512k。
    • -size 512k:大小等于 512k。
    • -size -512k:大小小于 512k。

作用:从当前目录递归的搜索文件。

原理:遍历当前工作目录及其子目录,find 命令是在硬盘上遍历查找,非常耗硬盘资源,查找效率相比 whereislocate 较低。

适用场合:能用 which、whereis 和 locate 的时候尽量不要用 find。例如:

1
2
3
4
5
[fenglepeng@centos]# find / -name zgz
/home/zgz
/home/zgz/zgz
/home/weblogic/bea/user_projects/domains/zgz
......

总结

find 遍历硬盘查找,通常使用 find / -name Filename,耗内存。

locate 和 whereis 是根据数据库查找,无法实时查找文件。有可能找到刚才删除的文件和无法找到新增的文件。which 根据 path 找可执行文件。whereis 可以用来找相关安装路径和二进制文件,可执行文件。

当我们用 whereis 和 locate 无法查找到我们需要的文件时,可以使用 find,但是 find 是在硬盘上遍历查找,因此非常消耗硬盘的资源,而且效率也非常低,因此建议大家优先使用 whereis 和 locate。


Linux 命令之 which whereis locate find
https://flepeng.github.io/002-Linux-21-命令-Linux-命令之-which-whereis-locate-find/
作者
Lepeng
发布于
2021年7月5日
许可协议