你的位置:首页 > 操作系统

[操作系统]linux系统中whereis的用法详解


whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s)。如果省略参数,则返回所有信息。

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

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

命令格式:

whereis [-bmsu] [BMS 目录名 -f ] 文件名

命令功能:

whereis命令是定位可执行文件、源代码文件、帮助文件在文件系统中的位置。这些文件的属性应属于原始代码,二进制文件,或是帮助文件。

whereis 程序还具有搜索源代码、指定备用搜索路径和搜索不寻常项的能力。

命令参数:

    -b   定位可执行文件。

    -m  定位帮助文件。

    -s   定位源代码文件。

    -u   搜索默认路径下除可执行文件、源代码文件、帮助文件以外的其它文件。

    -B   指定搜索可执行文件的路径。

    -M  指定搜索帮助文件的路径。

    -S   指定搜索源代码文件的路径。


whereis 使用举例:
1. 查找 date 命令的可执行文件、源代码和man手册的位置,输入:
    $ whereis date
    输出如下图:
       whereis-command-demo.gif
       Animated gif 01: whereis command running on my Debian based server
  1.1 如何只搜索二进制文件的位置?
       使用 -b 参数 :
         $ whereis -b date
  1.2 如何只搜索man手册的位置?
       使用 -m 参数:
         $ whereis -m date
  1.3 如何只搜索源代码文件的位置?
       使用 -s 参数:
         $ whereis -s date


问题:   whereis -u参数是有问题的,按照man whereis 的说明,-u的就是搜索那些没有二进制文件或者源代码文件或者man手册的文件的。但是实际测试发现,和这毛关系都没有。
   man手册上的一个例子:
   A file is said to be unusual if it does not have one entry of each requested type.

   Thus the following example, asks for those files in the current directory which have no documentation(意思是搜索当前目录下,没有man文档的文件)
   $ whereis -m -u *
   我们先cd /bin ,然后执行上面的命令,会发现  whereis -m -u *  和 where -m *   结果是一模一样的。-u的功能完全没体现出来。

   而且与man文档描述的完全不符,因为/bin目录下的文件都是有man文档的,按man文档的意思,结果应该是空的,但是结果却不是空的。


2. 如何限制搜索的路径?
   使用下面的参数限制对应的搜索路径:
      -B /path/to/dir : 限制在指定的目录搜索二进制文件.
      -M /path/to/dir : 限制在指定的目录搜索man手册文件.
      -S /path/to/dir : 限制在指定的目录搜索二进制文件.
   在使用了-B , -M , -S  任意一个参数时,必须加上 -f  参数, 然后指定要搜索的文件名.


  2.1 只在 /bin 目录下搜索 ls 和gcc。
       $ whereis -B /bin -f ls gcc
     结果如下:

       1
       2
       ls: /bin/ls /usr/share/man/man1/ls.1.gz
       gcc:
    可以看到,gcc在/bin目录下搜索二进制文件是没有结果的,说明gcc的二进制文件不在 /bin目录下。


问题:

   但是,我发现,虽然/bin目录下没有gcc二进制文件,但是使用上面的命令照样有输出,而不是像我翻译的这篇文章那样。
 
  2.2 这也是man手册上的例子,经测试,这里 -u参数还是和man手册上描述的不符合。
      查找所有/usr/bin目录下的,其man文档不在 /usr/man/man1/  ,且其源代码文件不在/usr/src/ 的 文件。
       # cd /usr/bin
       # whereis -u -ms -M /usr/man/man1 -S /usr/src -f *
      测试:
       #cd  /bin
       #whereis -u  -m -M /root  -f *
      按man手册的意思,这行命令的功能是:查找 所有/bin下,其man文档不在/root的文件。所以应该是有结果输出的,因为/root目录下根本没有任何文件的man手册。可以惊奇的发现,结果居然是空的。
whereis command options
From the whereis(1) command man page:
Option Meaning
-f Define search scope.
-b Search only binaries.
-B Define binaries lookup path.
-m Search only manual paths.
-M Define man lookup path.
-s Search only sources path.
-S Define sources lookup path.
-u Search from unusual enties.
-V Output version information and exit.无效的,man文档无此参数
-h Display this help and exit.    无效的,man文档无此参数
SEE ALSO
whereis(1) Linux/Unix command man page
Category List of Unix and Linux commands
File Management cat
Network Utilities dig • host • ip
Processes Management bg • chroot • disown • fg • jobs • kill • killall • pwdx • time • pidof • pstree
Searching whereis • which
User Information groups • id • last • lastcomm • logname • users • w • who • whoami • lid • members


关于whereis 的 -u参数的功能,因为不知道whereis的版本,不好查找对应版本的whereis的源代码,

我从网上找了个新版本的whereis的c源代码,明显的发现,whereis使用hard-coded paths。
whereis在git上的代码地址:https://github.com/karelzak/util-linux/blob/master/misc-utils/whereis.c#L96

 
反正 -u 参数实际很少使用的,有兴趣的可以看下这代码。

 

原网站地址:http://www.poluoluo.com/server/201502/338955.html

 

Chocoo           

2016.3.9          

----------------------------------------------------------------------------------------------------------------------------------------

Linux新人,欢迎各种指点。

感谢锋哥指点迷津!