Linux 下查找相关命令主要有以下 4 个:which、whereis、locate、find。

(1)which [-a] cmdname1 cmdname2 …

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

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

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

(2)whereis [-bmsu] filename1 filename2 …

作用:locate the binary, source, and manual page files for a command. 即:定位 / 返回与指定名字匹配的二进制文件、源文件和帮助手册文件所在的路径。

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

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

(3)locate [option] filename1 filename2 …

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

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

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

(4)find [option] [path1 path2 …] [filename]

参数说明:
时间查找参数:
-atime n: 将 n*24 小时内 access 过的文件列出来
-ctime n: 将 n*24 小时内状态发生改变的文件列出来
-mtime n: 将 n*24 小时内被修改过的文件列出来
-newer file: 把比 file 还要新的文件列出来
名称查找参数:
gid n: 寻找群组 ID 为 n 的文件
-group name: 寻找群组名称为 name 的文件
-uid n: 寻找拥有者 ID 为 n 的文件
-user name: 寻找拥有者名称为 name 的文件
-name file: 寻找文件名为 file 的文件(可以使用通配符)

作用:search for files in a directory hierarchy. 从当前目录递归的搜索文件。
原理:遍历当前工作目录及其子目录,find 命令是在硬盘上遍历查找,非常耗硬盘资源,查找效率相比 whereis 和 locate 较低。
适用场合:能用 which、whereis 和 locate 的时候尽量不要用 find.

(5) 四个命令对比

Linux 下 4 个查找命令 which、whereis、locate、find_帮助手册