Linux 中查找命令与文件:which、whereis、locate、find 怎么选

用正确的工具查找可执行命令、程序资料与任意文件,并理解 PATH 与索引数据库的差别。

适用环境:Ubuntu 22.04 LTS。命令搜索与文件搜索是两件不同的事,先明确目标会少走很多弯路。

想找什么优先命令特点
当前 shell 实际会执行哪个命令command -v 名称能识别 shell 内建命令、别名和函数
PATH 中的可执行文件which 名称简单,但不适合判断别名或函数
二进制、源码、手册的大致位置whereis 名称快,搜索范围有限
已建立索引的文件名locate 关键词非常快,结果可能不是最新
在真实目录树中精确查找find 路径 条件最可靠,但大范围搜索较慢

找“我现在运行的是谁”

1
2
command -v python
type -a python

command -v 最适合脚本与日常判断;type -a 会列出所有同名候选项。若安装了多个 Node、Python 或 CMake,这比单独使用 which 更能说明实际调用顺序。

原始资料用“复制 ls 到家目录”的实验说明了一个关键差异:which 只会返回位于 $PATH 中、且具有可执行权限的候选文件。需要列出全部候选项时可使用:

1
which -a ls

但不要把个人家目录为了测试而长期加入全局 PATH;这会让同名程序覆盖系统命令,增加排障与安全风险。

whereis:快速定位软件相关文件

1
2
whereis ls
whereis -b ls

whereis 查找预定义系统目录中的二进制文件、源码和手册页,适合快速了解软件安装位置。-b 只显示二进制文件。它不是“遍历整个硬盘”的工具;找不到结果不代表文件一定不存在。

按文件名找文件

1
2
find "$HOME" -type f -iname '*report*'
find /etc -type f -name '*.conf' 2>/dev/null

-iname 忽略大小写;第二个示例把权限错误重定向掉,避免干扰结果。搜索全盘前先限制目录,例如从 $HOME/etc 或项目目录开始。

使用 locate 前先理解“索引”

1
2
3
locate ssh_config
locate -r '\bls$'
sudo updatedb

locate 查询的是文件名数据库,并不实时遍历磁盘;刚创建或删除的文件可能还没反映出来。Ubuntu 22.04 常使用 plocate 提供该功能,updatedb 会刷新索引,耗时与磁盘内容有关。原始资料的 locate -r '\bls$' 示例展示了用正则把宽泛的文件名匹配缩小到以 ls 结尾的路径。

find:在指定目录中精确搜索

1
2
3
find "$HOME" /bin -type f -name 'ls' 2>/dev/null
find "$HOME" -type f -iname '*report*'
find /etc -type f -name '*.conf' 2>/dev/null

find 直接遍历目录树,是最可靠也最灵活的工具。必须明确写出起始路径:未提供路径时,find 默认从当前目录 . 开始,而不是从根目录 / 开始。搜索全盘前先限制目录,例如从 $HOME/etc 或项目目录开始。

出处

本文已依据补充提供的原始 HTML 重新核对,并保留其“复制 ls、修改权限、刷新索引”的对比思路;具体行为仍以 Ubuntu 22.04 本机命令输出为准。