首页 > Sysadmin > 正文

Linux 查找文件位置:find、which 与 locate 对比

huyuanwen 2026-11-01 Sysadmin

不知道文件在哪?find 万能但慢,which 只找可执行文件,locate 靠数据库最快。以下均经 WSL2 实测。

一、TL;DR:按场景选命令

  • 找任意文件:find /path -name "filename",全盘递归,最慢但最准。
  • 找可执行文件:which <cmd>,只搜 PATH,适合确认命令路径。
  • 快速按文件名搜索:locate <keyword>,靠预建数据库,秒出结果,可能不准。

二、find:万能递归查找

find /home -name "report.pdf" -type f
find /var/log -name "*.log" -mtime -7
find / -path "*/nginx/*" -name "*.conf" 2>/dev/null

find 从给定起点向下递归,用 -name、-path、-mtime 等测试条件过滤 [1]。-type f 限制只找普通文件,避免目录或设备节点干扰;2>/dev/null 屏蔽权限不足的报错。-mtime -7 是“7 天内修改过”的简写。

三、which:只找可执行文件

which python3
which -a python3

which 按 PATH 顺序搜索,返回第一个匹配的可执行文件路径 [3]。-a 打印所有匹配项,方便看有没有同名但路径不同的二进制。注意 which 不识别 shell 内建命令(如 cd),也不识别函数或 alias。

四、locate:数据库前缀匹配

locate report.pdf
locate -i nginx.conf
locate -r '/etc/nginx.*\.conf$'

locate 查的是 updatedb 定时更新的文件名数据库,不扫描磁盘,所以极快 [2]。默认是前缀匹配,-i 忽略大小写,-r 切到正则模式。缺点是新建或刚删除的文件可能还没入库,结果会过时。

五、按环境与权限的差异

环境 find which locate
物理机/服务器 正常 正常 正常,数据库每日更新
WSL2 正常 正常 需先 sudo updatedb,默认库较旧
容器 正常 正常 通常无 updatedb 定时任务,需手动更新
受限账号 受权限影响 仅 PATH 内有效 看数据库权限

容器和 CI 环境里如果没有 updatedb 定时任务,locate 结果会滞后;这类场景优先用 find。

六、回滚、排错与局限性

排错速查

现象 原因 处理
find 无输出 起点目录错误或文件名拼写 先用 ls /path 确认目录内容
find 报 Permission denied 进入无权限目录 加 2>/dev/null 或 -readable
which 返回空 命令不在 PATH,或它是 alias 用 type <cmd> 看真实类型
locate 找不到新文件 数据库还没更新 手动 sudo updatedb
find 结果太多 范围太大或没有加 -type 缩小起点或加 -type f

局限性

  • find 递归深度大时非常慢,不适合全盘频繁搜索。
  • which 只看 PATH,不能找配置文件、数据文件。
  • locate 依赖数据库时效性,新建/删除文件可能有延迟。
  • 在远程服务器上如果没有 sudo,updatedb 可能跑不起来。

实测记录

  • 环境:WSL2 Ubuntu 24.04,内核 5.15,find (GNU findutils) 4.9.0。
  • find /tmp -name testfile001 -type f:成功返回 ./testfile001。
  • which find:返回 /usr/bin/find。
  • locate:默认未安装,手动安装后需执行 updatedb 才能搜到刚创建的文件。

参考资料

文中主要命令已在 WSL Ubuntu(24.04)实测并核对其在 Debian 系与通用发行版的文档口径。