在 Linux 服务器上排查问题、定位配置文件时,「找到某个文件或目录」是最高频的操作之一。系统自带的 find、locate、which 等命令各有分工,配合 grep 还能进一步搜索文件内容。本文整理这几个命令的用法和常见使用场景。
一、命令选型速览
| 命令 | 搜索对象 | 特点 |
|---|---|---|
find | 文件名、目录 | 实时遍历磁盘,功能最全,可按大小/时间/权限过滤 |
locate | 文件名、目录 | 查询索引数据库,速度极快,但结果可能不是最新的 |
which / whereis | 可执行程序 | 只在 PATH 环境变量范围内查找 |
grep | 文件内容 | 按文本或正则表达式搜索文件里的内容 |
简单总结:找文件用 find,求快用 locate,找命令用 which,找内容用 grep。
二、find:按条件实时搜索
find 从指定目录开始递归遍历所有子目录,按条件筛选出匹配的文件或目录。基本语法:
find [搜索路径] [选项] [表达式]
1. 按名称搜索
# 在 /home 下精确查找名为 nginx.conf 的文件
find /home -name "nginx.conf"
# 忽略文件名大小写
find /etc -iname "Nginx.conf"
# 通配符要加引号,防止被 shell 提前展开
find /var/log -name "*.log"
2. 按类型搜索
-type 可以限定只搜文件或只搜目录:
# 只搜索目录
find /opt -type d -name "node_modules"
# 只搜索普通文件
find /etc -type f -name "*.conf"
常见类型:f 普通文件、d 目录、l 符号链接。
3. 按大小搜索
# 查找大于 100MB 的文件(排查磁盘占用常用)
find / -type f -size +100M
# 查找小于 1KB 的文件
find . -type f -size -1k
单位支持 c(字节)、k、M、G。
4. 按时间搜索
# 最近 7 天内修改过的文件
find /var/www -type f -mtime -7
# 7 天前修改的文件(清理旧日志时常用)
find /var/log -name "*.log" -mtime +7
# 最近 30 分钟内修改过的文件
find . -type f -mmin -30
-mtime 的单位是天,-mmin 的单位是分钟;- 表示「以内」,+ 表示「超过」。
5. 限制搜索深度
默认会递归搜索所有层级,目录很大时可以用 -maxdepth 限制深度,明显提速:
# 只搜索当前目录及其一层子目录
find . -maxdepth 2 -name "*.js"
6. 对搜索结果执行操作
-exec 可以把搜索结果交给其他命令处理,是最实用的组合:
# 查找并直接删除 30 天前的日志
find /var/log -name "*.log" -mtime +30 -exec rm -f {} \;
# 批量修改权限
find /var/www -type f -exec chmod 644 {} \;
其中 {} 代表匹配到的每个文件,\; 表示命令结束。删除操作建议先用 ls -l {} 或去掉 -exec 预览一遍结果,确认无误再执行。
三、locate:基于索引的快速搜索
locate 不直接扫描磁盘,而是查询系统维护的文件索引数据库,因此速度极快,适合只知道文件名大概内容的场景:
# 查找所有路径中包含 nginx 的文件
locate nginx.conf
# 忽略大小写
locate -i nginx.conf
# 限制最多显示 10 条
locate -n 10 "*.log"
注意:索引数据库默认每天由 updatedb 定时任务更新一次,刚创建的文件可能搜不到。可以手动刷新:
sudo updatedb
如果系统没有安装,可以用包管理器安装(CentOS 为 yum install mlocate,Ubuntu/Debian 为 apt install mlocate)。
四、which 与 whereis:搜索可执行程序
想确认某个命令安装在哪里、用的是哪个版本,用 which:
which node
# 输出类似:/root/.local/share/fnm/aliases/default/bin/node
whereis 除可执行文件外,还会一并返回手册页和源码路径:
whereis nginx
# 输出类似:nginx: /usr/sbin/nginx /etc/nginx /usr/share/man/man8/nginx.8.gz
这两个命令只在 $PATH 包含的目录中搜索,不会全盘扫描。
五、grep:搜索文件内容
找到文件之后,往往还需要搜文件里的内容,这时用 grep:
# 在当前目录递归搜索包含 "listen" 的行
grep -rn "listen" /etc/nginx
# 忽略大小写
grep -rni "error" /var/log/app.log
# 使用扩展正则表达式
grep -rEn "port[:=][0-9]+" /etc
常用参数:
| 参数 | 说明 |
|---|---|
-r | 递归搜索目录下的所有文件 |
-n | 显示匹配行的行号 |
-i | 忽略大小写 |
-l | 只显示包含匹配内容的文件名 |
-E | 使用扩展正则表达式 |
-C 3 | 显示匹配行的前后各 3 行上下文 |
六、常见场景实战
场景一:忘记配置文件放在哪了,只记得文件名
find / -name "myapp.service" 2>/dev/null
2>/dev/null 用于屏蔽「权限不足」等错误输出,让结果更干净。
场景二:磁盘快满了,找出占空间的大文件
find / -type f -size +500M 2>/dev/null -exec ls -lh {} \;
场景三:找出最近改动过的文件,排查被谁改过
find /etc -type f -mtime -1
场景四:确认命令实际执行的是哪个版本
which -a node # -a 列出 PATH 中所有匹配的 node
场景五:搜索并统计项目里 TODO 的数量
grep -rn "TODO" ./src | wc -l
七、小结
find是最通用的搜索工具,支持按名称、类型、大小、时间过滤,还能用-exec对结果直接执行操作;locate基于索引数据库,速度最快,但新文件需先执行updatedb;which/whereis只在 PATH 范围内搜索可执行程序;grep负责搜索文件内容,配合find几乎可以定位任何问题。
日常使用中记住「find 找文件、grep 找内容」这一条,就足以应对绝大多数排查场景。