适用环境:Ubuntu 22.04 LTS。命令搜索与文件搜索是两件不同的事,先明确目标会少走很多弯路。
| 想找什么 | 优先命令 | 特点 |
|---|---|---|
| 当前 shell 实际会执行哪个命令 | command -v 名称 | 能识别 shell 内建命令、别名和函数 |
| PATH 中的可执行文件 | which 名称 | 简单,但不适合判断别名或函数 |
| 二进制、源码、手册的大致位置 | whereis 名称 | 快,搜索范围有限 |
| 已建立索引的文件名 | locate 关键词 | 非常快,结果可能不是最新 |
| 在真实目录树中精确查找 | find 路径 条件 | 最可靠,但大范围搜索较慢 |
找“我现在运行的是谁”
| |
command -v 最适合脚本与日常判断;type -a 会列出所有同名候选项。若安装了多个 Node、Python 或 CMake,这比单独使用 which 更能说明实际调用顺序。
原始资料用“复制 ls 到家目录”的实验说明了一个关键差异:which 只会返回位于 $PATH 中、且具有可执行权限的候选文件。需要列出全部候选项时可使用:
| |
但不要把个人家目录为了测试而长期加入全局 PATH;这会让同名程序覆盖系统命令,增加排障与安全风险。
whereis:快速定位软件相关文件
| |
whereis 查找预定义系统目录中的二进制文件、源码和手册页,适合快速了解软件安装位置。-b 只显示二进制文件。它不是“遍历整个硬盘”的工具;找不到结果不代表文件一定不存在。
按文件名找文件
| |
-iname 忽略大小写;第二个示例把权限错误重定向掉,避免干扰结果。搜索全盘前先限制目录,例如从 $HOME、/etc 或项目目录开始。
使用 locate 前先理解“索引”
| |
locate 查询的是文件名数据库,并不实时遍历磁盘;刚创建或删除的文件可能还没反映出来。Ubuntu 22.04 常使用 plocate 提供该功能,updatedb 会刷新索引,耗时与磁盘内容有关。原始资料的 locate -r '\bls$' 示例展示了用正则把宽泛的文件名匹配缩小到以 ls 结尾的路径。
find:在指定目录中精确搜索
| |
find 直接遍历目录树,是最可靠也最灵活的工具。必须明确写出起始路径:未提供路径时,find 默认从当前目录 . 开始,而不是从根目录 / 开始。搜索全盘前先限制目录,例如从 $HOME、/etc 或项目目录开始。
出处
- 原始参考:linux 命令 which、whereis、locate、find 的区别(splinzer,知乎)
- 手册参考:GNU findutils 文档
本文已依据补充提供的原始 HTML 重新核对,并保留其“复制 ls、修改权限、刷新索引”的对比思路;具体行为仍以 Ubuntu 22.04 本机命令输出为准。