locate找不到刚创建的文件是因为它只查询预建的数据库(/var/lib/mlocate/mlocate.db),不实时扫描文件系统;需运行sudo updatedb手动更新数据库才能识别新文件。

locate 命令本身不实时扫描文件系统,它查的是预建的数据库(/var/lib/mlocate/mlocate.db),所以新建、重命名或删除文件后,locate 默认找不到——必须手动更新数据库才能生效。
为什么 locate 找不到刚创建的文件
因为 locate 不访问磁盘,只查本地缓存的文件路径索引。这个索引默认每天由 systemd 定时任务(mlocate-updatedb.timer)触发更新,非 root 用户无法触发,且不会感知到你刚 touch 的文件。
- 运行
sudo updatedb立即重建数据库(注意:耗时取决于文件数量,SSD 上通常几秒到十几秒) - 检查数据库最后修改时间:
stat /var/lib/mlocate/mlocate.db | grep "Modify" - 如果系统禁用了定时更新(比如某些最小化安装的 CentOS/Alpine),
updatedb可能根本没装,需先sudo apt install mlocate(Debian/Ubuntu)或sudo yum install mlocate(RHEL/CentOS)
locate 模糊匹配和通配符的实际用法
locate 默认做子串匹配,不是正则;但支持 shell 风格的通配符(* 和 ?),且必须加引号,否则会被 shell 提前展开。
- 查所有
.conf文件:locate "*.conf"(不加引号会报错或返回空) - 查
/etc下以net开头的文件:locate "/etc/net*" - 查文件名含
docker但不区分大小写:locate -i docker - 限制结果行数避免刷屏:
locate -n 20 nginx.conf
权限问题导致部分路径查不到
updatedb 默认跳过非 root 可读目录(如普通用户家目录下的 ~/.local 或加密 ~/Private),即使你有读权限,数据库里也不会收录这些路径。
- 查看当前
updatedb的排除规则:grep -E "PRUNEPATHS|PRUNEFS" /etc/updatedb.conf - 若需包含用户目录,可临时改配置并重跑:
sudo sed -i 's/\/home/#\/home/' /etc/updatedb.conf && sudo updatedb(不推荐长期开启,会显著拖慢更新速度) - 更安全的做法是:对私有路径用
find替代,比如find ~/Downloads -name "*.log" 2>/dev/null
真正麻烦的不是怎么用 locate,而是它查不到时你误以为文件丢了——其实只是数据库没跟上。更新频率、路径权限、通配符转义,三个点卡住一个,结果就全偏了。











