Linux的几种查找命令

来源:互联网 发布:mac电脑双系统切换 编辑:程序博客网 时间:2024/04/30 01:33

which命令
which用来查找系统命令,比如ls、cat等,它是从PATH变量指定的文件夹中搜索的,当指定的文件夹中有与该命令同名的二进制文件时,就会给出这个文件的路径,也就是该命令的路径。
但是,好像必须是二进制文件才可以,我试过在/usr/bin中随便加一个文件,然后which并没有搜出来:

m@meng:/bin$ sudo touch newm@meng:/bin$ which newm@meng:/bin$ 

然并卵啊。。。
which在默认情况下,只返回第一个匹配到的结果;加上-a参数,可以返回所有匹配结果。


locate命令
该命令查找文件的方式是搜寻系统中的一个数据库,如果要找的文件或命令在该数据库中有相应的记录,那么就可以返回相应的结果,否则就查找不到。这个数据库呢,称为“系统文件索引数据库”(嗯,没错,本大人起的名字),它是由updatedb命令建立和维护的,man一下这个命令,可以看到这个数据库文件的位置是/var/lib/mlocate/mlocate.db(我的是Ubuntu系统14.04),用vim打开是一堆乱码,我也就死了那条研究它的心。
总之,locate和下面将要提到的whereis命令都是通过读取这个数据库文件而实现快速查找的。man手册上说:updatedb is usually run daily by cron(8) to update the default database. 这意味着,updatedb在每天某个固定的点才会去更新数据库。所以,可能刚刚新建的文件还没有被加入数据库因而查找不到,这个时候需要手动输入updatedb来更新数据库。
locate命令的基本格式为:locate options pattern,pattern就是任意的字符串,当然一般我们要搜寻的是一个文件名或其路径。这个pattern是支持正则表达式的,man手册说:If –regex is not specified, PATTERNs can contain globbing characters. If any PATTERN contains no globbing characters, locate behaves as if the pattern were *PATTERN* .
然后是常用的几个选项:

  • -c:count,计数,即只列出有多少个匹配项,不列出那些匹配结果。
  • -e:exist,在所有匹配pattern的项里,若某个项此时(locate命令此次运行时)已经不存在(被删除或重命名),将不再显示。只显示那些仍然存在的项。
m@meng:~$ locate -e m/new /home/m/newm@meng:~$ mv new oldm@meng:~$ locate -e m/new m@meng:~$ 

重命名之后,再用locate搜索new就找不到了。。

  • -i:忽略大小写。
  • -l或-n:后面跟数字,限定显示的匹配项的个数。
  • -b:Match only the base name against the specified patterns. 这是man手册上的说明,问题是什么叫base name?而且man上给出的唯一一个例子也是关于-b的,我感觉这个选项很重要,但是现在还理解不了:
    To search for a file named exactly NAME (not NAME), use
    locate -b ‘\NAME’
    Because \ is a globbing character, this disables the implicit replacement of NAME by NAME.

whereis命令
虽然都是查询同一个数据库,但是whereis和locate查找使用的关键字不太一样,locate可以查找任意的字符串,但whereis只能查找那些可执行的二进制文件,比如系统命令,或者通过yum、apt-get等安装的软件的名字,而普通文件它基本上是不理会的。
默认情况下,whereis命令会输出有关程序(命令或可执行二进制文件)的三项位置信息:二进制文件本身、man说明文档、源代码。如下:

m@meng:~/program/C_codes$ whereis lsls: /bin/ls /usr/share/man/man1/ls.1.gz

一般系统命令的源码默认没有安装,所以不显示。
有几个选项可以控制whereis的输出或者查找项:

  • -b:只查找或只显示二进制文件;
  • -m:只查找或只显示man手册;
  • -s:只查找或只显示源码。
    还有几个选项用来显示查找的范围:
  • -B:限制查找二进制文件的目录;
  • -M:限制查找man手册的目录;
  • -S:限制查找源码的目录
    个人感觉whereis命令的使用还是有很多限制的。

* find命令*
这个是最强大的文件搜索命令,但是速度比不上locate。其基本的语法为:find 路径 选项 其他。暂时就不写它了,需要专门写一篇文章才能搞定。

0 0
原创粉丝点击