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

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)