首页 > Sysadmin > 正文

Linux 按名字查找文件夹的三种工具

huyuanwen 2026-10-26 Sysadmin

按名字找文件夹有三条路:find 实时遍历目录树,locate 查预建索引,ls 的通配符只适合当前目录。选哪条看范围与频率。

find -type d:遍历目录树

find 属于 GNU findutils。-type d 限定只匹配目录 [2],-name 按基名匹配、-iname 忽略大小写 [1]。实测(mktemp 目录树,wsl-pass):不加 -type d 时同名文件 demo/backup/logs 混入结果,加上后只剩目录。手册还提醒 -name 不含斜杠,-name ‘a/b’ 永不命中,跨层路径要用 -path;实测 -path ‘*/data/*’ 命中 demo/data/reports,-prune 可跳过整棵子树 [1]。find 是实时扫描,目录树越大越慢,这正是 locate 走索引路线的原因。

mkdir -p demo/home/logs demo/var/log demo/backup && touch demo/backup/logs
find demo -name logs              # 目录与文件都命中
find demo -type d -name logs      # 只命中目录
find demo -type d -iname logs     # 忽略大小写
find demo -type d -path '*/data/*'

通配符必须加引号

手册明确:通配符要写在引号里,否则会被 shell 先展开 [1]。实测在含 zlog 文件的目录里,find . -type d -name *log* 被展开成 -name zlog,匹配全错;加引号则正确命中(wsl-pass)。

find demo -type d -name '*log*'
find / -type d -name '*logs*' 2>/dev/null

从 / 开始扫描时,无权限目录会把 Permission denied 写到 stderr。实测加 2>/dev/null 后噪音被过滤,命中结果照常输出;不加则报错与结果混在一起(wsl-pass)。

locate/plocate:先建索引再查(本段未实测)

locate 不扫磁盘,而是查 updatedb 建立的文件名数据库;updatedb 通常由 cron 定期执行,默认排除 /tmp 等目录 [3][4]。较新的 Debian/Ubuntu 中,locate 命令来自 plocate 包,官方描述为更快的 locate 实现、mlocate 的直接替代 [5]。本机 WSL Ubuntu 24.04 未装 locate/plocate,以下命令基于文档核查,尚未实测:

sudo apt install plocate
sudo updatedb                 # 首次建库较慢,新装机器可能尚未建库
locate -b logs                # -b 只按基名匹配

索引不存在时 locate 会直接报错,所以先确认 updatedb 已经运行 [4]。

ls 通配符与 whereis:各管一段

当前目录里找目录,ls -d */ 最快;实测 ls -d */*/ 能列出下一层,再深就力不从心(wsl-pass)。whereis 只回答命令本身装在哪,实测 whereis find 返回 /usr/bin/find 与 man、info 路径,它不是文件搜索器。按范围选:当前目录用 ls,指定树用 find,全局高频查询用 plocate。


参考资料

文中主要命令已在 WSL Ubuntu(24.04)实测,个别条目(未装工具/安装类命令)仅核对官方文档,未实际执行。