4Linux操作命令which,whereis,locate

  • which 命令
  • whereis 命令
  • locate 命令

which 命令

which 命令的作用是,在 PATH 变量指定的路径中搜索可执行文件的所在位置。它一般用来确认系统中是否安装了指定的软件。

(1)命令格式

1
which 可执行文件名称

(2)常用范例

  • 例一:确认是否安装了 gcc,可以使用如下命令:
1
which gcc
  • 例二:查看 cd 命令的位置路径,可以使用如下命令:
1
which cd

linux 系统上执行 which cd 命令,显示显示在 PATH 变量指定的路径下没有 cd 命令。为什么显示没有呢?这是因为 cd 是 shell 内建命令,而 which 默认是找 PATH 内所指定的目录,内建命令不在其指定的目录中,所以当然一定找不到。

那么就有个问题,为什么实验楼环境中 cd 是一个 shell 函数,而其他 linux 环境中 cd 是内建命令呢?这跟所使用的 bash 有关。

echo $SHELL 命令查看当前使用的 shell。

补充知识

到底什么是命令?

命令可以是下面四种形式之一:

是一个可执行程序,就像我们所看到的位于目录/usr/bin 中的文件一样。 属于这一类的程序,可以编译成二进制文件,诸如用 C 和 C++语言写成的程序, 也可以是由脚本语言写成的程序,比如说 shell,perl,python,ruby,等等。

是一个内建于 shell 自身的命令。bash 支持若干命令,内部叫做 shell 内部命令 (builtins)。例如,上面我本地环境中的 cd 命令,就是一个 shell 内部命令。

是一个 shell 函数。这些是小规模的 shell 脚本,它们混合到环境变量中。 比如上面讲到的 cd 命令,在实验楼环境中就是一个 shell 函数。

是一个命令别名。我们可以定义自己的命令,建立在其它命令之上。

whereis 命令

whereis 命令主要用于定位可执行文件、源代码文件、帮助文件在文件系统中的位置。whereis 命令还具有搜索源代码、指定备用搜索路径和搜索不寻常项的能力。

whereis 命令查找速度非常快,这是因为它根本不是在磁盘中漫无目的乱找,而是在一个数据库中(/var/lib/mlocate/)查询。这个数据库是 Linux 系统自动创建的,包含有本地所有文件的信息,并且每天通过自动执行 updatedb 命令更新一次。也正是因为这个数据库要每天才更新一次,就会使得 whereis 命令的搜索结果有时候会不准确,比如刚添加的文件可能搜不到。

(1)命令格式

1
whereis [选项] 文件

(2)常用参数

参数 描述
-b 定位可执行文件
-m 定位帮助文件
-s 定位源代码文件
-u 搜索默认路径下除可执行文件、源代码文件、帮助文件以外的其它文件
-B 指定搜索可执行文件的路径
-M 指定搜索帮助文件的路径
-S 指定搜索源代码文件的路径

(3)常用范例

  • 例一:搜索 gcc 可执行文件的路径,可以使用如下命令:
1
whereis -b gcc
  • 例二:搜索 gcc 帮助文件的路径,可以使用如下命令:
1
whereis -m gcc
  • 例三:搜索 gcc 源代码的路径,可以使用如下命令:
1
whereis -s gcc

locate 命令

locate 命令跟 whereis 命令类似,且它们使用的是相同的数据库。但 whereis 命令只能搜索可执行文件、联机帮助文件和源代码文件,如果要获得更全面的搜索结果,可以使用 locate 命令。

locate 命令使用了十分复杂的匹配语法,可以使用特殊字元(如’*’和’?’)来指定需要查找的样本。

(1)命令格式

1
locate [选项] [搜索字符串]

(2)常用参数

参数 描述
-q 安静模式,不会显示任何错误讯息
-n 至多显示 n 个输出
-r 使用正规表达式做寻找的条件
-V 显示版本讯息

(3)常用范例

  • 例一:搜索 etc 目录下所有以 sh 开头的文件,可以使用如下命令:
1
locate /etc/sh

注意在实验楼环境中一开始执行这个命令会报错:locate 无法执行 stat() ‘/var/lib/mlocate/mlocate.db’:没有那个文件或目录。解决办法是执行sudo updatedb命令。

  • 例二:搜索 etc 目录下文件名包含 lou 的文件,可以使用如下命令:
1
locate /etc/*lou*