不知道文件在哪?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才能搜到刚创建的文件。
参考资料
- [1] find(1) – Linux manual page (man7.org)(find(1))
- [2] locate(1) – Linux manual page (man7.org)(locate(1))
- [3] which(1) – Debian stretch man page(which(1))
文中主要命令已在 WSL Ubuntu(24.04)实测并核对其在 Debian 系与通用发行版的文档口径。