Linux中主要有which,whereis,locate,find四种查询命令,其可以满足我们日常工作中全部的查询需求。那么在实际的工作中,我们应该怎样选择合适的命令呢?
特点
1.which只能够查找可直接执行的命令
2.whereis搜索范围比which大,除了可直接执行的命令,还可以查找man文件和源文件
3.locate的查找范围更大,几乎可以覆盖你想要查找的所有文件,适合快速查找指定文件
4.find是最强大的也是最慢的,适合查找当前几个命令找不到的文件。
那么问题来了,locate为什么不能像find命令一样完全覆盖所有的文件呢?
工作原理分析
下面我们来分析一下这几个命令的工作原理:
- which只在PATH环境变量中配置的路径里查找目标文件,目录结构简单,所以最快,所以最适合校验系统是否已安装被查找的命令。
- whereis和locate,这两个命令是我们查找文件名最常用的命令,为什么这两个命令要一起分析呢,是因为他们最基本的原理是一样的,都是通过Linux文件数据库来定位文件的。
这里涉及到Linux系统的一个机制:Linux会将系统内的所有文件都记录在一个数据库文件里/var/lib/mlocate,但是这个数据库文件默认每天更新一次,如果需要手动更新,需要调用updatedb,比较耗时。
就是因为这个机制,所以whereis和locate查找出来的文件信息可能是错误的,这是这两个命令最大的缺陷。
那么这两个命令的区别在哪里呢?
1.whereis 是全匹配才会返回结果,而locate是部分匹配即可返回结果,所以locate返回的结果一定>=whereis返回的结果
2.whereis只能查找二进制文件,man说明文件,源代码文件,locate则可以查找所有类型的文件
3.whereis可以指定查找目录,locate则无法指定查找目录 - find是最强大的查找工具,但是由于这个命令是直接查找的磁盘文件,所以查找速度缓慢,是以上三个命令都无法满足我们需求时的最后手段
基本应用
注:此处只简要说明笔者常用手段
- which [-a] command
不加-a 只列举查找到的第一个命令,加-a列举处全部同名可执行文件 - whereis [-bBmMsSfu] 文件或目录名
-b只查找二进制文件
-B[目录] #只在指定目录下查找二进制文件
-m # 只查找man说明文件
-M[目录] # 只在目录中查找说明文件
-s # 只查找源代码文件
-S[目录] # 只在目录查找源代码文件 - locate [-ir] keyword
-i 忽略大小写
-r 查找符合正则表达式的项 - 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) | 正则表达式中没有 |
~- | 上一个工作目录 | 正则表达式中没有 |
网友评论