查新文件用 find,查老文件且要快就用 locate;两者互补而非替代:locate 查数据库(默认每日更新),故新建文件需 sudo updatedb 才能被找到;find 实时遍历但可精准过滤条件、限制深度并屏蔽错误。

直接说结论:查新文件用 find,查老文件且要快就用 locate;两者不是替代关系,是互补关系。
为什么 locate 找不到刚创建的文件
locate 不是实时扫描硬盘,它查的是一个本地数据库(通常是 /var/lib/mlocate/mlocate.db),这个库默认每天由 cron 触发一次 updatedb 更新。所以你 touch new.conf 后立刻 locate new.conf,大概率返回空——不是命令坏了,是库还没收录。
- 手动更新库:运行
sudo updatedb(普通用户无权写库) - 更新耗时取决于文件系统大小,SSD 上一般几秒到几十秒
- 如果频繁新建文件又急需定位,
locate就不适合,得切回find
find 搜索慢但能精确控制范围和条件
find 是边走边找,每进一个目录就检查权限、读 inode、比对条件,所以慢,但也因此能做 locate 做不了的事:比如“找过去 1 小时内修改过、属主是 www-data、大小在 10KB–50KB 之间的所有 .log 文件”。
- 缩小搜索路径能显著提速:别一上来就
find / -name "*.conf",先试find /etc -name "*.conf" - 加
-maxdepth 2可限制只查两层子目录,避免钻进/proc或/sys这类伪文件系统卡住 - 遇到权限拒绝(
Permission denied)不中断:加2>/dev/null屏蔽报错,或用find /path -readable -name "x"(需 GNU find 4.9+)
-name 和 -iname 的实际差异
-name 区分大小写,-iname 不区分,但它们都只作用于**基名(basename)**,也就是最后一段路径名。例如 find /var/log -name "nginx*.log" 能匹配 /var/log/nginx-access.log,但不会匹配 /var/log/nginx/error.log(因为基名是 error.log,不满足模式)。
- 通配符支持:
*(任意字符)、?(单个字符)、[abc](字符集)、[!a-z](取反) - 注意 shell 展开陷阱:写
find . -name *.log时,* 可能被当前 shell 先展开成已有文件名,导致匹配失败;应写成find . -name "*.log"加引号 - 正则支持更强但更重:用
-regex需完整匹配整个路径,比如find /var/log -regex ".*/nginx.*\.log"
locate 的 -i 和 find 的 -iname 都不能解决中文模糊匹配
这两个选项只处理 ASCII 字符的大小写转换,对中文、日文等 Unicode 字符无效。比如你建了文件 配置文件.txt,用 locate -i "peizhi" 或 find -iname "peizhi" 都找不到——因为拼音和汉字不是大小写关系,而是完全不同的编码序列。
真要按拼音或语义搜中文名,得靠外部工具如 ripgrep(配合 --files)或写脚本预处理文件名,locate 和 find 原生不支持。











