Ceiling

Linux 搜索特定目录或文件

在 Linux 服务器上排查问题、定位配置文件时,「找到某个文件或目录」是最高频的操作之一。系统自带的 findlocatewhich 等命令各有分工,配合 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(字节)、kMG

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 找内容」这一条,就足以应对绝大多数排查场景。