核心结论是 Linux 文件的查找方法主要分为 find locate which whereis 这四类核心命令,find 是实时全盘递归查找,功能最强大,可以按名称大小时间权限所有者等多种条件筛选,locate 依靠预建数据库快速检索,查询速度很快但是不是实时数据,which 专门查找可执行命令的路径,whereis 可以同时定位命令二进制文件源码和帮助手册,运维日常最常用的 Linux 文件的查找方法就是 find,适合精准复杂条件搜索,locate 适合快速模糊查找,which 和 whereis 专门针对系统命令定位,不同查找工具底层原理不一样,适用场景差别很大,掌握每种工具的优缺点,就可以根据需求选择合适的 Linux 文件的查找方法,不用每次都使用性能消耗很高的全盘 find 扫描。
Linux 设计多种 Linux 文件的查找方法,是因为查找需求场景不一样,find 是实时遍历目录树,读取磁盘上真实文件信息,优点是条件灵活,缺点是磁盘文件数量庞大的时候扫描耗时久,占用 IO 资源,locate 提前通过定时任务 updatedb 生成文件索引数据库,查询的时候直接读数据库,不需要遍历磁盘,速度优势明显,缺点是新建或者删除的文件还没有更新数据库,会出现查找结果不准,which 只在 PATH 环境变量定义的目录里面搜索可执行程序,用来确认命令到底调用的是哪一个版本,whereis 在 which 基础上扩展,除了二进制程序,还会查找 man 手册和源码文件,这也是为什么很多新手查找普通文件使用 which 查不到,本质就是工具定位目标不一样。
Linux 文件的查找方法总览表格
| 命令 | 查找原理 | 查找对象 | 核心优势 | 主要缺点 |
|---|---|---|---|---|
| find | 实时递归遍历目录 | 任意普通文件目录设备文件 | 多条件组合筛选,实时准确 | 大磁盘扫描慢,占用 IO |
| locate | 查询预生成索引数据库 | 几乎全部文件 | 查询速度极快 | 非实时,需要更新数据库 |
| which | 检索 PATH 路径 | 可执行命令程序 | 快速定位命令执行路径 | 只能查可执行文件 |
| whereis | 检索系统标准目录 | 二进制 源码 man 手册 | 同时返回多类相关文件 | 只搜索系统固定目录 |
详细操作步骤
find 实时查找操作
基础按名称查找 find /-name "test.txt" 从根目录递归查找名字是 test.txt 的文件
不区分大小写写法 find /-iname "test.txt"
按文件大小查找 find /data -size +100M 查找大于 100M 的文件,-100M 代表小于 100M
按修改时间查找 find /var/log -mtime +7 查找七天之前修改的文件
按所有者查找 find /home -user alice 查找属于 alice 用户的文件
按权限查找 find /-perm 755 查找权限是 755 的文件
查找之后可以联动执行动作,比如 find /-name ".tmp" -delete 查找到之后直接删除,也可以 exec 调用其他命令处理
执行的时候可以指定起始目录,不需要每次都从根目录扫描,缩小搜索范围可以大幅提升速度
locate 数据库查找操作
执行 locate nginx.conf 直接模糊匹配文件名,快速输出所有匹配路径
数据库更新命令 updatedb,新建文件之后想要立刻被 locate 识别,手动执行 updatedb 更新索引
注意 locate 默认模糊匹配,不需要通配符,适合记得部分文件名但是不确定完整名字的场景
定时任务一般是系统每日自动执行 updatedb,所以当天新建文件有可能查不到
which 命令查找操作
执行 which python,返回当前 PATH 里面 python 可执行文件完整路径
如果系统里面安装多个版本 python,which 可以确认终端调用的是哪一个版本
which 只会查找可执行程序,普通文档配置文件用 which 是查不到的
whereis 扩展查找操作
执行 whereis nginx,会同时输出 nginx 二进制程序路径,man 手册路径,源码相关位置
whereis 搜索范围是系统标准目录,用户自定义目录里面的文件,whereis 不一定可以搜到
进阶注意要点
find 执行全盘搜索的时候会产生大量权限报错,可以把错误输出丢弃,优化查找体验
find 支持多条件组合,比如同时满足大于 100M 并且修改时间超过 30 天,是 Linux 文件的查找方法里面功能最强的组合筛选能力
locate 数据库默认会排除部分临时目录,部分文件不会收录在索引里面
which 依赖 PATH 环境变量,如果 PATH 配置错误,which 就无法找到对应命令
生产服务器执行 find 全盘扫描尽量避开业务高峰,防止 IO 占用过高影响业务
【常见问题】
问题 1 Linux 文件的查找方法里面 find 和 locate 最大区别是什么
回答 1 Linux 文件的查找方法中 find 是实时遍历磁盘,结果准确,支持复杂筛选,locate 是读取预建数据库,速度很快但是数据不是实时,新增文件需要 updatedb 更新之后,Linux 文件的查找方法使用 locate 才能查到。
问题 2 Linux 文件的查找方法 which 为什么查找普通配置文件没有结果
回答 2 Linux 文件的查找方法 which 设计用途就是查找 PATH 里面的可执行命令,普通配置文件不属于可执行程序,所以查不到,查找普通文件应该使用 find 或者 locate 这类 Linux 文件的查找方法。
问题 3 Linux 文件的查找方法 find 全盘扫描很慢怎么优化
回答 3 Linux 文件的查找方法 find 全盘扫描慢是因为递归遍历全部目录,优化方式是缩小起始搜索目录,不要直接从根目录搜索,叠加精准筛选条件,大磁盘环境可以改用 locate 这种 Linux 文件的查找方法提升查询速度。
问题 4 Linux 文件的查找方法 whereis 和 which 有什么差异
回答 4 Linux 文件的查找方法 which 只返回可执行程序路径,whereis 除了二进制程序,还会查找 man 手册和源码文件,whereis 搜索范围是系统标准目录,两种 Linux 文件的查找方法都不适合查找用户自定义普通文件。
【免责申明】
本文内容仅作为 Linux 技术学习参考,Linux 文件的查找方法相关命令执行全盘扫描会占用磁盘 IO,生产环境使用 Linux 文件的查找方法的时候尽量避开业务高峰,find 搭配 delete 等动作属于高危操作,执行前建议先预览查找结果,不要直接执行删除处理,操作产生业务卡顿数据误删等后果由操作者自行承担。


