在Linux系统中如何快速定位和精确查找它呢?下面总结了五个常用的基础命令,分别是which、whereis、type、locate、find。
一、which
which命令用于查找并显示给定命令的绝对路径,环境变量PATH中保存了查找命令时需要遍历的目录。which指令会在环境变量$PATH设置的目录里查找符合条件的文件。也就是说,使用which命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。
语法
which [选项] [参数]
选项
-n<文件名长度>:制定文件名长度,指定的长度必须大于或等于所有文件中最长的文件名;
-p<文件名长度>:与-n参数相同,但此处的<文件名长度>包含了文件的路径;
-w:指定输出时栏位的宽度;
-V:显示版本信息。
参数
指令名:指令名列表。
二、whereis
whereis命令首先会去掉filename中的前缀空格和以.开头的任何字符,然后再在数据库(var/lib/slocate/slocate.db)中查找与上述处理后的filename相匹配的二进制文件、源文件和帮助手册文件,使用之前可以使用updatedb命令手动更新数据库。
语法
whereis [选项] [参数]
选项
-b:只查找二进制文件;
-B<目录>:只在设置的目录下查找二进制文件;
-f:不显示文件名前的路径名称;
-m:只查找说明文件;
-M<目录>:只在设置的目录下查找说明文件;
-s:只查找原始代码文件;
-S<目录>只在设置的目录下查找原始代码文件;
-u:查找不包含指定类型的文件。
参数
指令名:要查找的二进制程序、源文件和man手册页的指令名。
三、type
type命令用来显示指定命令的类型,判断给出的指令是内部指令还是外部指令。
命令类型:
alias:别名。
keyword:关键字,Shell保留字。
function:函数,Shell函数。
builtin:内建命令,Shell内建命令。
file:文件,磁盘文件,外部命令。
unfound:没有找到。
语法
type [选项] [参数]
选项
-t:输出“file”、“alias”或者“builtin”,分别表示给定的指令为“外部指令”、“命令别名”或者“内部指令”;
-p:如果给出的指令为外部指令,则显示其绝对路径;
-a:在环境变量“PATH”指定的路径中,显示给定指令的信息,包括命令别名。
参数
指令:要显示类型的指令。
四、locate
locates是查询系统上预建的文建索引数据库(/var/lib/mlocate/mlocate.db)依赖实现构建的索引。索引的构建是在系统较为空闲时自动进行(周期性任务),管理员手动更新数据库(updatedb)索引构建过程需要遍历整个根文件系统,极消耗资源.
工作特点:
查找速度快
模糊查找
非实时查找
搜索的是文件的全路径,不仅仅是文件名
可能只搜索用户具备读取和执行权限的目录
语法
locate [选项][参数]
或
locate [参数]
选项
-b, --basename -- 仅匹配路径名的基本名称
-c, --count -- 只输出找到的数量
-d, --database DBPATH -- 使用 DBPATH 指定的数据库,而不是默认数据库 /var/lib/mlocate/mlocate.db
-e, --existing -- 仅打印当前现有文件的条目
-1 -- 如果 是 1.则启动安全模式。在安全模式下,使用者不会看到权限无法看到 的档案。这会始速度减慢,因为 locate 必须至实际的档案系统中取得档案的 权限资料。
-0, --null -- 在输出上带有NUL的单独条目
-S, --statistics -- 不搜索条目,打印有关每个数据库的统计信息
-q -- 安静模式,不会显示任何错误讯息。
-P, --nofollow, -H -- 检查文件存在时不要遵循尾随的符号链接
-l, --limit, -n LIMIT -- 将输出(或计数)限制为LIMIT个条目
-n -- 至多显示 n个输出。
-m, --mmap -- 被忽略,为了向后兼容
-r, --regexp REGEXP -- 使用基本正则表达式
--regex -- 使用扩展正则表达式
-q, --quiet -- 安静模式,不会显示任何错误讯息
-s, --stdio -- 被忽略,为了向后兼容
-o -- 指定资料库存的名称。
-h, --help -- 显示帮助
-i, --ignore-case -- 忽略大小写
-V, --version -- 显示版本信息
参数
查找字符串:要查找的文件名中含有的字符串。
五、find
find 命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则 find 命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。
工作特点:
查找速度略慢
精确查找
实时查找
可能只搜索用户具备读取和执行权限的目录
语法
find path -option [ -print ] [ -exec -ok command ] {} \;
实例
- 将当前目录及其子目录下所有文件后缀为 .c 的文件列出来:
# find . -name "*.c"
- 将当前目录及其子目录中的所有文件列出:
# find . -type f
- 将当前目录及其子目录下所有最近 20 天内更新过的文件列出:
# find . -ctime -20
- 查找 /var/log 目录中更改时间在 7 日以前的普通文件,并在删除之前询问它们:
# find /var/log -type f -mtime +7 -ok rm {} \;
- 查找当前目录中文件属主具有读、写权限,并且文件所属组的用户和其他用户具有读权限的文件:
# find . -type f -perm 644 -exec ls -l {} \;
- 查找系统中所有文件长度为 0 的普通文件,并列出它们的完整路径:
# find / -type f -size 0 -exec ls -l {} \;
六、命令比较
which | whereis | locate | find | |
---|---|---|---|---|
文件支持 | 可执行文件 | 二进制文件、 源文件、 帮助文档 | 所有文件类型 | 所有文件类型 |
查找原理 | 环境变量PATH | 数据库索引 | 数据库索引 | 可指定,默认遍历当前路径以及子路径 |
查找原理 | 遍历PATH所指定的目录, 寻找完全匹配filenam的可执行文件 | 数据库索引,对去除.之后的所有字符后的filename进行完全匹配 | 数据库索引,绝对路径,部分匹配 | 遍历磁盘 |
查找效率 /速度 | 高 | 高 | 高 | 低 |
适应场景 | 可执行文件的查找 | 二进制文件,源文件,帮助文档的查找 | 模糊查找(由于默认是部分匹配,会列出很多无关文件) | 能使用which,whereis,locate时,尽量不适用find |