文章列表
9 分钟阅读

Linux 搜索命令教程:find、grep、locate、rg 应该怎么选


系列:Linux 命令基础

第 3 / 16 篇

  1. Tmux 入门教程:让 SSH 断线和多任务终端不再中断
  2. Tree 命令教程:快速查看和导出目录结构
  3. Linux 搜索命令教程:find、grep、locate、rg 应该怎么选
  4. Linux 压缩与解压命令教程:tar、zip、gzip、xz、zstd 一次讲清
  5. Linux 文本处理命令教程:cat、less、head、tail、wc、sort、uniq
  6. Linux 权限命令教程:chmod、chown、umask
  7. Linux 进程查看与管理:ps、top、htop、kill、jobs
  8. Linux 网络排查命令:ss、curl、dig、ping、traceroute
  9. systemctl 与 journalctl 入门:管理服务和查看日志
  10. rsync 使用指南:服务器文件同步与备份
  11. Linux 服务器安全基础:SSH、用户权限、防火墙和 fail2ban
  12. 线上问题排查流程:日志、端口、进程、磁盘、网络怎么一步步看
  13. 深入浅出:Linux 树状目录神器 tree 命令的安装与使用指南
  14. Linux 系统 Vim 编辑器终极指南:从入门到精通
  15. SSH 隧道实战:本地转发、远程转发和动态转发
  16. SSH Config 使用指南:别名、跳板机与多服务器管理

背景

Linux 中“搜索”并不是只有一个命令。

你可能想找的是:

  • 某个文件在哪里;
  • 某个目录中包含哪些 .log 文件;
  • 哪些文件写了某个配置项;
  • 一个命令到底安装在哪;
  • 一个软件包是否存在;
  • 项目里哪一处引用了某个函数、接口或环境变量。

不同需求应该使用不同工具。最常见的选择可以先记住:

如果你只是想先看清目录结构,建议先读 Tree 命令教程:快速查看和导出目录结构;搜索到目标文件后需要归档或传输时,可以接着看 Linux 压缩与解压命令教程:tar、zip、gzip、xz、zstd 一次讲清

找文件名或目录:find
找文件内容:grep
快速按文件名查索引:locate
在代码项目中搜索文本:rg(ripgrep)
查命令路径:command -v、type、whereis
搜索可安装软件包:apt search

本文以 Debian / Ubuntu 为例,讲清楚这些工具分别适合什么场景,并给出可直接复制的实用命令。

步骤

1. 先判断你到底要搜索什么

搜索前先判断目标类型,可以避免使用错误命令:

需求推荐命令示例
找名为 docker-compose.yml 的文件findfind . -name 'docker-compose.yml'
找包含 DATABASE_URL 的文件grepgrep -RIn 'DATABASE_URL' .
快速找系统中路径含 nginx.conf 的文件locatelocate nginx.conf
在代码仓库搜索函数、变量、接口rgrg 'class UserService'
python 命令来自哪里command -vcommand -v python
搜索可安装的软件包apt searchapt search docker

后续章节会分别解释。

2. 使用 find 按名称、类型和条件查找文件

find 是 Linux 中最通用的文件查找工具。它会直接遍历目录,因此结果准确,但在大型目录中可能比索引型工具慢。

基本格式:

Terminal window
find 搜索起点 条件

在当前目录查找文件名:

Terminal window
find . -name 'README.md'

查找所有 Python 文件:

Terminal window
find . -name '*.py'

查找指定目录中的 YAML 文件:

Terminal window
find /opt/my-app -name '*.yml'

文件名忽略大小写:

Terminal window
find . -iname 'readme.md'

只查找目录:

Terminal window
find . -type d -name 'node_modules'

只查找普通文件:

Terminal window
find . -type f -name '*.log'

在服务器上搜索时,常会遇到没有权限进入某些目录的提示。可以把错误输出隐藏:

Terminal window
sudo find / -type f -name 'nginx.conf' 2>/dev/null

2>/dev/null 的意思是把错误信息重定向到空设备,不在终端显示。

3. 用 find 按时间、大小和权限筛选

find 不只可以按名称查找,也能按文件时间、大小、类型等条件组合筛选。

查找最近 7 天内修改过的日志:

Terminal window
find /var/log -type f -name '*.log' -mtime -7

查找 30 天前修改过的文件:

Terminal window
find /var/log -type f -mtime +30

查找大于 1 GB 的文件:

Terminal window
find / -type f -size +1G 2>/dev/null

查找小于 10 MB 的文件:

Terminal window
find . -type f -size -10M

查找空文件:

Terminal window
find . -type f -empty

查找空目录:

Terminal window
find . -type d -empty

查找具有可执行权限的 Shell 脚本:

Terminal window
find . -type f -name '*.sh' -executable

多个条件可以组合。例如,查找最近 3 天修改过且大于 100 MB 的备份文件:

Terminal window
find /backup -type f -name '*.tar.gz' -mtime -3 -size +100M

4. 用 find 执行批量操作时要特别谨慎

find 可以对找到的文件执行命令,例如删除临时文件:

Terminal window
find /tmp -type f -name '*.tmp' -delete

但批量删除前,应先只查看匹配结果:

Terminal window
find /tmp -type f -name '*.tmp'

确认结果无误后,再执行删除。

更安全的方式是先交互确认:

Terminal window
find /tmp -type f -name '*.tmp' -ok rm {} \;

其中:

{} 表示当前找到的文件
\; 表示命令结束
-ok 每个文件执行前都询问确认

处理文件名中可能包含空格、换行或特殊字符时,优先使用 -print0xargs -0

Terminal window
find . -type f -name '*.log' -print0 | xargs -0 ls -lh

不要把未经确认的 find 结果直接接到 rm -rf。尤其不要在 //home/var 等系统目录中试错。

5. 使用 grep 搜索文件内容

当你知道“内容是什么”,但不知道它写在哪个文件里时,使用 grep

在当前目录递归搜索文本:

Terminal window
grep -RIn 'DATABASE_URL' .

参数含义:

-R 递归搜索子目录
-I 忽略二进制文件
-n 显示匹配行号

只显示匹配到的文件名:

Terminal window
grep -RIl 'DATABASE_URL' .

忽略大小写:

Terminal window
grep -RIn -i 'error' .

搜索完整单词:

Terminal window
grep -RIn -w 'docker' .

搜索多个关键词:

Terminal window
grep -RIn -E 'ERROR|FATAL|Exception' /var/log

排除目录:

Terminal window
grep -RIn \
--exclude-dir=node_modules \
--exclude-dir=.git \
--exclude-dir=.venv \
'TODO' .

排除特定文件类型:

Terminal window
grep -RIn --exclude='*.min.js' 'apiKey' .

查看带有上下文的日志匹配结果:

Terminal window
grep -n -C 3 'ERROR' app.log

其中 -C 3 表示额外显示匹配行前后各 3 行。

6. 使用 rg(ripgrep)搜索代码项目

rg 是 ripgrep 的命令名。它适合在代码项目中快速搜索文本,常用于查找函数、类、变量、接口路径和配置项。

Debian / Ubuntu 安装:

Terminal window
sudo apt update
sudo apt install -y ripgrep

基础搜索:

Terminal window
rg 'DATABASE_URL'

只搜索 Python 文件:

Terminal window
rg 'BaseModel' -g '*.py'

只搜索 TypeScript 和 TSX 文件:

Terminal window
rg 'useState' -g '*.ts' -g '*.tsx'

忽略大小写:

Terminal window
rg -i 'todo'

显示行号是默认行为;如果只想显示文件名:

Terminal window
rg -l 'DATABASE_URL'

显示匹配前后上下文:

Terminal window
rg -C 3 'Exception'

搜索隐藏文件和隐藏目录:

Terminal window
rg --hidden 'SECRET'

忽略 .gitignore 规则并搜索所有文件:

Terminal window
rg -uuu 'SECRET'

rg -uuu 会搜索隐藏文件、被忽略文件和二进制文件,可能把 .env、构建产物或依赖目录也包含进来。除非排障需要,不要在大型项目中默认使用。

在 Git 项目中,rg 默认会遵循 .gitignore,因此日常搜索通常不会扫描 node_modules、构建目录等被忽略内容。这也是它非常适合代码库的原因。

7. 使用 locate 快速按文件名搜索

locate 不会每次都遍历磁盘,而是查询系统预先建立的文件名数据库,因此速度很快。

安装 plocate

Terminal window
sudo apt update
sudo apt install -y plocate

更新文件名数据库:

Terminal window
sudo updatedb

搜索 Nginx 配置文件:

Terminal window
locate nginx.conf

查找包含 docker 的路径:

Terminal window
locate docker

只匹配文件名最后一段,而不是整条路径:

Terminal window
locate --basename 'docker-compose.yml'

限制最多显示 20 条结果:

Terminal window
locate -l 20 nginx.conf

locate 的优点是快,但它的结果可能不是实时的:刚创建或刚删除的文件,要等数据库更新后才会反映出来。

因此可以这样选择:

需要实时、准确结果:find
需要在整台机器上快速找常见文件:locate

8. 查找一个命令安装在哪里

有时你能执行某个命令,但不知道它来自系统包、别名、Shell 函数还是某个虚拟环境。

优先使用:

Terminal window
command -v python

查看命令类型和所有候选位置:

Terminal window
type -a python

查看常见可执行文件、源码和 man 手册位置:

Terminal window
whereis nginx

查看 Shell 是否设置了别名:

Terminal window
alias | grep 'll'

常见示例:

Terminal window
command -v docker
type -a python
whereis git

可以这样理解:

command -v:最适合脚本中判断命令是否存在
type -a:适合排查别名、函数和多个同名命令
whereis:适合快速查看二进制、源码和 man 路径

9. 搜索命令说明和可安装软件包

忘记命令名称,但记得大致用途时,可以搜索 man 手册关键词:

Terminal window
apropos archive

也可以写成:

Terminal window
man -k archive

例如搜索与压缩有关的命令。

在 Debian / Ubuntu 中搜索可安装的软件包:

Terminal window
apt search docker

只看已安装的软件包:

Terminal window
apt list --installed | grep -i docker

查看某个命令由哪个软件包提供:

Terminal window
dpkg -S "$(command -v nginx)"

例如:

Terminal window
dpkg -S "$(command -v ssh)"

这在服务器排障时很有用,可以帮助你确认某个程序到底来自哪个系统包。

10. 常用搜索场景速查

查找当前项目中的 Docker Compose 文件:

Terminal window
find . -name 'compose.yaml' -o -name 'docker-compose.yml'

查找大于 500 MB 的文件:

Terminal window
find . -type f -size +500M

查找 7 天内修改过的日志:

Terminal window
find /var/log -type f -name '*.log' -mtime -7

在项目中搜索环境变量:

Terminal window
rg 'DATABASE_URL|REDIS_URL|SECRET_KEY'

在项目中搜索 TODO 和 FIXME:

Terminal window
rg 'TODO|FIXME|HACK'

排除依赖目录搜索文本:

Terminal window
grep -RIn \
--exclude-dir=node_modules \
--exclude-dir=.git \
--exclude-dir=.venv \
'错误关键字' .

查找正在监听的端口:

Terminal window
sudo ss -lntp

查找日志中最近的错误:

Terminal window
grep -n -i -C 3 'error\|fatal\|exception' app.log

查找系统中所有名为 .env 的文件:

Terminal window
sudo find / -type f -name '.env' 2>/dev/null

.env 文件可能包含数据库密码、API Key 和令牌。搜索到后不要把内容复制到公开聊天、代码仓库或截图中。

常见问题

1. find 很慢怎么办?

find 会实际遍历目录。不要轻易对根目录无限制搜索:

Terminal window
find /

更好的方式:

Terminal window
# 限定目录
find /opt/my-app -name '*.log'
# 限定深度
find . -maxdepth 3 -name '*.py'
# 使用 locate 快速查已有索引
locate nginx.conf

2. grep 搜索时出现 Permission denied 怎么办?

如果目录需要 root 权限:

Terminal window
sudo grep -RIn '关键字' /etc

如果只是不想看到权限错误:

Terminal window
grep -RIn '关键字' /some/path 2>/dev/null

但不要为了隐藏报错而忽略真正重要的问题。对系统配置目录进行搜索时,优先确认自己是否具有正确权限。

3. grep 为什么把二进制文件也匹配出来?

可以加 -I 忽略二进制文件:

Terminal window
grep -RIIn '关键字' .

对于代码项目,更推荐直接使用 rg

Terminal window
rg '关键字'

4. locate 为什么找不到刚创建的文件?

因为 locate 使用数据库,数据库可能还没有更新。

手动更新:

Terminal window
sudo updatedb

刚创建、刚删除或位于未被索引目录中的文件,使用 find 会更可靠。

5. 为什么 find 中的通配符要加引号?

正确写法:

Terminal window
find . -name '*.py'

错误写法:

Terminal window
find . -name *.py

不加引号时,Shell 会先展开 *.py,导致 find 收到的参数不是你预期的搜索模式。

greprg 中的复杂正则也建议使用单引号包裹,以避免 Shell 提前处理特殊字符。

6. 搜索结果中有空格或特殊字符的文件名怎么办?

不要使用这种不安全的组合:

Terminal window
find . -name '*.txt' | xargs rm

更可靠的方式:

Terminal window
find . -name '*.txt' -print0 | xargs -0 rm

不过删除前仍建议先把 rm 换成 ls -l 检查:

Terminal window
find . -name '*.txt' -print0 | xargs -0 ls -l

7. 应该优先用 grep 还是 rg?

如果系统默认已安装、只做简单文本搜索,使用 grep 就足够。

如果你经常写代码、搜索大型项目,建议安装并优先使用 rg

grep:系统基础工具,几乎所有 Linux 环境都能使用
rg :速度快、适合代码项目、默认遵循 .gitignore

总结

Linux 搜索工具的关键不是“记住一个万能命令”,而是先根据搜索目标选择工具。

找文件名、时间、大小、权限:find
找文件内容:grep
快速找已索引的文件名:locate
在代码仓库搜索文本:rg
查命令实际位置:command -v / type -a / whereis
找软件包:apt search

日常开发最值得记住的几个命令:

Terminal window
find . -name '*.py'
grep -RIn '关键字' .
rg '关键字'
locate 文件名
command -v 命令名
apt search 软件包名

掌握这几类工具后,无论是找项目文件、排查日志、定位配置,还是分析服务器环境,都会快很多。