美文网首页
查找四兄弟which,whereis,locate,find

查找四兄弟which,whereis,locate,find

作者: HugiFish | 来源:发表于2019-04-27 22:08 被阅读0次

    Linux中主要有which,whereis,locate,find四种查询命令,其可以满足我们日常工作中全部的查询需求。那么在实际的工作中,我们应该怎样选择合适的命令呢?


    特点

    1.which只能够查找可直接执行的命令
    2.whereis搜索范围比which大,除了可直接执行的命令,还可以查找man文件和源文件
    3.locate的查找范围更大,几乎可以覆盖你想要查找的所有文件,适合快速查找指定文件
    4.find是最强大的也是最慢的,适合查找当前几个命令找不到的文件。
    那么问题来了,locate为什么不能像find命令一样完全覆盖所有的文件呢?


    工作原理分析

    下面我们来分析一下这几个命令的工作原理:

    1. which只在PATH环境变量中配置的路径里查找目标文件,目录结构简单,所以最快,所以最适合校验系统是否已安装被查找的命令。
    2. whereis和locate,这两个命令是我们查找文件名最常用的命令,为什么这两个命令要一起分析呢,是因为他们最基本的原理是一样的,都是通过Linux文件数据库来定位文件的。
      这里涉及到Linux系统的一个机制:Linux会将系统内的所有文件都记录在一个数据库文件里/var/lib/mlocate,但是这个数据库文件默认每天更新一次,如果需要手动更新,需要调用updatedb,比较耗时。
      就是因为这个机制,所以whereis和locate查找出来的文件信息可能是错误的,这是这两个命令最大的缺陷。
      那么这两个命令的区别在哪里呢?
      1.whereis 是全匹配才会返回结果,而locate是部分匹配即可返回结果,所以locate返回的结果一定>=whereis返回的结果
      2.whereis只能查找二进制文件,man说明文件,源代码文件,locate则可以查找所有类型的文件
      3.whereis可以指定查找目录,locate则无法指定查找目录
    3. find是最强大的查找工具,但是由于这个命令是直接查找的磁盘文件,所以查找速度缓慢,是以上三个命令都无法满足我们需求时的最后手段

    基本应用

    注:此处只简要说明笔者常用手段

    1. which [-a] command
      不加-a 只列举查找到的第一个命令,加-a列举处全部同名可执行文件
    2. whereis [-bBmMsSfu] 文件或目录名
      -b只查找二进制文件
      -B[目录] #只在指定目录下查找二进制文件
      -m # 只查找man说明文件
      -M[目录] # 只在目录中查找说明文件
      -s # 只查找源代码文件
      -S[目录] # 只在目录查找源代码文件
    3. locate [-ir] keyword
      -i 忽略大小写
      -r 查找符合正则表达式的项
    4. find [path] [option] [action]
      -mtime +n/n/-n n表示文件更改时间距离为n天/-n 表示文件更改时间距离在n天以内(不包含第n天)/+n 表示文件更改时间距离在n天以前(不包含第n天)
      -name :后边接需要查找的文件名值得注意的是,此处如果需要模糊匹配,则需要应用通配符,而非正则表达式
      -regex:后边接正则表达式,但是由于正则表达式是搜索模式是全路径,而非文件名。
      -size [+-] SIZE:查找比SIZE大(+)或者小(-)的文件,这个文件是有格式的:c表示byte,k表示千字节,M(注意大写)兆,G吉
      -type :查找一类文件++
      下面说一下利用-name和-regex 搜索时的区别
    #在/usr/include下查找匹配了str的所有文件
    对:find /usr/include -name "str*"
    错:find /usr/include -name "str.*"#因为这里需要用通配符,而非正则表达式
    对:find /usr/include -regex  ".*str.*"
    错:find /usr/include -regex  "str.*" #因为是全路径搜索
    
    • bash的通配符一览表
    元字符 说明 与正则表达式中的对比说明
    * 匹配0个或者多个任意字符 不同,正则表达式中的含义是:匹配前面的子表达式一次或者多次,区别在于通配符默认匹配的是任意字符,而正则表达式是可以指定的
    ? 匹配1个任意字符 不同,正则表达式中的含义是:匹配前面的子表达式零次或者一次
    [abc...] 匹配包含的任何一个字符 相同
    [!abc...] 匹配中括号中没有的字符 相同
    匹配用户的主目录 正则表达式中没有
    ~name name用户的主目录 正则表达式中没有
    ~+ 当前的工作目录($pwd) 正则表达式中没有
    ~- 上一个工作目录 正则表达式中没有

    相关文章

      网友评论

          本文标题:查找四兄弟which,whereis,locate,find

          本文链接:https://www.haomeiwen.com/subject/skooiqtx.html