
你需要找一个文件。你知道它在某个目录下,但不确定具体位置。你打开终端,开始犹豫:用find?它很慢,但能找到所有东西。用locate?它快,但可能找不到刚创建的文件。which和whereis好像是找程序的。四个命令,四个用途,你经常用错。
今天把它们放在一起讲清楚。用对了,效率翻倍;用错了,浪费时间。
先看一个数据
find每次搜索都会实时扫描指定目录的所有文件。一个包含10万个文件的目录,find可能需要几秒钟到几十秒。locate通过预建的数据库搜索,几乎是瞬间返回结果,但数据库默认每天更新一次,新文件可能找不到。
这不意味着哪个更好。它们各自有适合的场景。
find:实时扫描,精确控制,慢但准
find是功能最强大的文件查找工具。它不会依赖任何索引,每执行一次就直接扫描磁盘上的文件和目录。
基本用法:
bash
find /var/www/html -name "*.php" -mtime -1 # 在当前目录下按名称查找所有PHP文件,且是最近一天内修改过的
常用参数:
bash
find / -type f -size +100M # 按类型找文件,按大小筛选 find / -name "*.log" -mtime +30 -delete # 根据修改时间筛选并删除
速度分析:find /从根目录开始扫描整个文件系统,非常消耗时间和I/O。如果你知道文件可能在哪里,尽量指定一个更精确的起始目录。比如你知道文件在/var下,就用find /var代替find /。find的优势在于条件和动作非常丰富,几乎可以做任何事。
locate:基于数据库,秒级返回,但不实时
locate不直接扫描磁盘,而是查询一个预建的数据库(通常由updatedb命令更新)。因为这个数据库已经存储了文件名和路径,locate搜索速度极快。
基本用法:
bash
locate nginx.conf # 输出所有路径中包含nginx.conf的文件
注意:locate查的是数据库,不是磁盘。你刚创建的文件,locate可能找不到。更新数据库:
bash
sudo updatedb
更新后可以强制同步数据库。但更新过程可能耗时,系统通常每天自动更新一次。建议:找刚创建的文件用find;找系统文件或不太可能新增的文件用locate。
which:找命令的可执行文件位置
which在PATH环境变量定义的目录中查找命令的位置。当你输入nginx时,系统会按PATH顺序查找名为nginx的可执行文件。which nginx会告诉你系统找到的第一个。
bash
which nginx which python # 查看所有位置 which -a python
适用场景:了解系统执行的到底是哪个版本的命令;在脚本中获取命令路径;排查“为什么我装了软件但命令找不到”的问题。
whereis:找命令的二进制文件、源码和手册页
whereis不仅搜索PATH,还搜索系统默认的源码和帮助文档目录。
bash
whereis nginx # 输出:nginx: /usr/sbin/nginx /etc/nginx /usr/share/man/man8/nginx.8.gz
which只找可执行文件(二进制文件)的位置,不关心源码和文档。如果你需要知道配置文件在哪,whereis更有用。
四个命令对比速查
| 命令 | 搜索范围 | 速度 | 实时性 | 主要用途 |
|---|---|---|---|---|
find | 指定目录(全盘扫描) | 慢 | 实时 | 强大条件搜索,支持动作(删除、执行等) |
locate | 系统数据库 | 极快 | 非实时 | 快速查找已知文件,系统文件 |
which | PATH环境变量 | 快 | 实时 | 查找命令的可执行文件路径 |
whereis | 标准系统目录 | 快 | 实时 | 查找命令的二进制、源码和手册页 |
实战场景
场景一:找昨天修改过的Nginx配置文件
find /etc/nginx -type f -mtime -1 -name "*.conf"。因为你知道在/etc/nginx下,用find精确指定目录。
场景二:快速确认系统里有没有Python3
which python3或whereis python3。你不想全盘扫描,which或whereis足够。
场景三:找最近出现的大日志文件
find /var/log -name "*.log" -size +100M -mtime -3。用find按大小、名称和修改时间联合筛选。
场景四:快速找php.ini在哪里
locate php.ini。系统文件变动不频繁,locate速度最快。
真实案例
某次排查磁盘空间时,运维先用locate找了一堆大文件,但刚生成的一个10GB的core dump没出现在结果中,因为数据库没更新。改用find / -type f -size +1G -exec ls -lh {} \;,很快找到了那个文件。
问题解决后他总结:查系统文件用locate,查刚发生的文件用find。实时需求用find,快速索引需求用locate,这是它们之间最根本的选择依据。
最后一句
这四个命令不是竞品。它们分工不同,各自有适合的场景。你需要找什么、找多快、能接受多准,决定了该用哪一个。which和whereis是命令定位专家,locate是快速索引工具,find是全能扫描器。
下次找文件前,先想几秒:文件大概在哪?需要多快?需要多精确?选对了命令,你的效率会明显提升。




