系列:Linux 命令基础
- Tmux 入门教程:让 SSH 断线和多任务终端不再中断
- Tree 命令教程:快速查看和导出目录结构
- Linux 搜索命令教程:find、grep、locate、rg 应该怎么选
- Linux 压缩与解压命令教程:tar、zip、gzip、xz、zstd 一次讲清
- Linux 文本处理命令教程:cat、less、head、tail、wc、sort、uniq
- Linux 权限命令教程:chmod、chown、umask
- Linux 进程查看与管理:ps、top、htop、kill、jobs
- Linux 网络排查命令:ss、curl、dig、ping、traceroute
- systemctl 与 journalctl 入门:管理服务和查看日志
- rsync 使用指南:服务器文件同步与备份
- Linux 服务器安全基础:SSH、用户权限、防火墙和 fail2ban
- 线上问题排查流程:日志、端口、进程、磁盘、网络怎么一步步看
- 深入浅出:Linux 树状目录神器 tree 命令的安装与使用指南
- Linux 系统 Vim 编辑器终极指南:从入门到精通
- SSH 隧道实战:本地转发、远程转发和动态转发
- 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 的文件 | find | find . -name 'docker-compose.yml' |
找包含 DATABASE_URL 的文件 | grep | grep -RIn 'DATABASE_URL' . |
快速找系统中路径含 nginx.conf 的文件 | locate | locate nginx.conf |
| 在代码仓库搜索函数、变量、接口 | rg | rg 'class UserService' |
查 python 命令来自哪里 | command -v | command -v python |
| 搜索可安装的软件包 | apt search | apt search docker |
后续章节会分别解释。
2. 使用 find 按名称、类型和条件查找文件
find 是 Linux 中最通用的文件查找工具。它会直接遍历目录,因此结果准确,但在大型目录中可能比索引型工具慢。
基本格式:
find 搜索起点 条件在当前目录查找文件名:
find . -name 'README.md'查找所有 Python 文件:
find . -name '*.py'查找指定目录中的 YAML 文件:
find /opt/my-app -name '*.yml'文件名忽略大小写:
find . -iname 'readme.md'只查找目录:
find . -type d -name 'node_modules'只查找普通文件:
find . -type f -name '*.log'在服务器上搜索时,常会遇到没有权限进入某些目录的提示。可以把错误输出隐藏:
sudo find / -type f -name 'nginx.conf' 2>/dev/null2>/dev/null 的意思是把错误信息重定向到空设备,不在终端显示。
3. 用 find 按时间、大小和权限筛选
find 不只可以按名称查找,也能按文件时间、大小、类型等条件组合筛选。
查找最近 7 天内修改过的日志:
find /var/log -type f -name '*.log' -mtime -7查找 30 天前修改过的文件:
find /var/log -type f -mtime +30查找大于 1 GB 的文件:
find / -type f -size +1G 2>/dev/null查找小于 10 MB 的文件:
find . -type f -size -10M查找空文件:
find . -type f -empty查找空目录:
find . -type d -empty查找具有可执行权限的 Shell 脚本:
find . -type f -name '*.sh' -executable多个条件可以组合。例如,查找最近 3 天修改过且大于 100 MB 的备份文件:
find /backup -type f -name '*.tar.gz' -mtime -3 -size +100M4. 用 find 执行批量操作时要特别谨慎
find 可以对找到的文件执行命令,例如删除临时文件:
find /tmp -type f -name '*.tmp' -delete但批量删除前,应先只查看匹配结果:
find /tmp -type f -name '*.tmp'确认结果无误后,再执行删除。
更安全的方式是先交互确认:
find /tmp -type f -name '*.tmp' -ok rm {} \;其中:
{} 表示当前找到的文件\; 表示命令结束-ok 每个文件执行前都询问确认处理文件名中可能包含空格、换行或特殊字符时,优先使用 -print0 和 xargs -0:
find . -type f -name '*.log' -print0 | xargs -0 ls -lh不要把未经确认的 find 结果直接接到 rm -rf。尤其不要在 /、/home、/var 等系统目录中试错。
5. 使用 grep 搜索文件内容
当你知道“内容是什么”,但不知道它写在哪个文件里时,使用 grep。
在当前目录递归搜索文本:
grep -RIn 'DATABASE_URL' .参数含义:
-R 递归搜索子目录-I 忽略二进制文件-n 显示匹配行号只显示匹配到的文件名:
grep -RIl 'DATABASE_URL' .忽略大小写:
grep -RIn -i 'error' .搜索完整单词:
grep -RIn -w 'docker' .搜索多个关键词:
grep -RIn -E 'ERROR|FATAL|Exception' /var/log排除目录:
grep -RIn \ --exclude-dir=node_modules \ --exclude-dir=.git \ --exclude-dir=.venv \ 'TODO' .排除特定文件类型:
grep -RIn --exclude='*.min.js' 'apiKey' .查看带有上下文的日志匹配结果:
grep -n -C 3 'ERROR' app.log其中 -C 3 表示额外显示匹配行前后各 3 行。
6. 使用 rg(ripgrep)搜索代码项目
rg 是 ripgrep 的命令名。它适合在代码项目中快速搜索文本,常用于查找函数、类、变量、接口路径和配置项。
Debian / Ubuntu 安装:
sudo apt updatesudo apt install -y ripgrep基础搜索:
rg 'DATABASE_URL'只搜索 Python 文件:
rg 'BaseModel' -g '*.py'只搜索 TypeScript 和 TSX 文件:
rg 'useState' -g '*.ts' -g '*.tsx'忽略大小写:
rg -i 'todo'显示行号是默认行为;如果只想显示文件名:
rg -l 'DATABASE_URL'显示匹配前后上下文:
rg -C 3 'Exception'搜索隐藏文件和隐藏目录:
rg --hidden 'SECRET'忽略 .gitignore 规则并搜索所有文件:
rg -uuu 'SECRET'
rg -uuu会搜索隐藏文件、被忽略文件和二进制文件,可能把.env、构建产物或依赖目录也包含进来。除非排障需要,不要在大型项目中默认使用。
在 Git 项目中,rg 默认会遵循 .gitignore,因此日常搜索通常不会扫描 node_modules、构建目录等被忽略内容。这也是它非常适合代码库的原因。
7. 使用 locate 快速按文件名搜索
locate 不会每次都遍历磁盘,而是查询系统预先建立的文件名数据库,因此速度很快。
安装 plocate:
sudo apt updatesudo apt install -y plocate更新文件名数据库:
sudo updatedb搜索 Nginx 配置文件:
locate nginx.conf查找包含 docker 的路径:
locate docker只匹配文件名最后一段,而不是整条路径:
locate --basename 'docker-compose.yml'限制最多显示 20 条结果:
locate -l 20 nginx.conflocate 的优点是快,但它的结果可能不是实时的:刚创建或刚删除的文件,要等数据库更新后才会反映出来。
因此可以这样选择:
需要实时、准确结果:find需要在整台机器上快速找常见文件:locate8. 查找一个命令安装在哪里
有时你能执行某个命令,但不知道它来自系统包、别名、Shell 函数还是某个虚拟环境。
优先使用:
command -v python查看命令类型和所有候选位置:
type -a python查看常见可执行文件、源码和 man 手册位置:
whereis nginx查看 Shell 是否设置了别名:
alias | grep 'll'常见示例:
command -v dockertype -a pythonwhereis git可以这样理解:
command -v:最适合脚本中判断命令是否存在type -a:适合排查别名、函数和多个同名命令whereis:适合快速查看二进制、源码和 man 路径9. 搜索命令说明和可安装软件包
忘记命令名称,但记得大致用途时,可以搜索 man 手册关键词:
apropos archive也可以写成:
man -k archive例如搜索与压缩有关的命令。
在 Debian / Ubuntu 中搜索可安装的软件包:
apt search docker只看已安装的软件包:
apt list --installed | grep -i docker查看某个命令由哪个软件包提供:
dpkg -S "$(command -v nginx)"例如:
dpkg -S "$(command -v ssh)"这在服务器排障时很有用,可以帮助你确认某个程序到底来自哪个系统包。
10. 常用搜索场景速查
查找当前项目中的 Docker Compose 文件:
find . -name 'compose.yaml' -o -name 'docker-compose.yml'查找大于 500 MB 的文件:
find . -type f -size +500M查找 7 天内修改过的日志:
find /var/log -type f -name '*.log' -mtime -7在项目中搜索环境变量:
rg 'DATABASE_URL|REDIS_URL|SECRET_KEY'在项目中搜索 TODO 和 FIXME:
rg 'TODO|FIXME|HACK'排除依赖目录搜索文本:
grep -RIn \ --exclude-dir=node_modules \ --exclude-dir=.git \ --exclude-dir=.venv \ '错误关键字' .查找正在监听的端口:
sudo ss -lntp查找日志中最近的错误:
grep -n -i -C 3 'error\|fatal\|exception' app.log查找系统中所有名为 .env 的文件:
sudo find / -type f -name '.env' 2>/dev/null
.env文件可能包含数据库密码、API Key 和令牌。搜索到后不要把内容复制到公开聊天、代码仓库或截图中。
常见问题
1. find 很慢怎么办?
find 会实际遍历目录。不要轻易对根目录无限制搜索:
find /更好的方式:
# 限定目录find /opt/my-app -name '*.log'
# 限定深度find . -maxdepth 3 -name '*.py'
# 使用 locate 快速查已有索引locate nginx.conf2. grep 搜索时出现 Permission denied 怎么办?
如果目录需要 root 权限:
sudo grep -RIn '关键字' /etc如果只是不想看到权限错误:
grep -RIn '关键字' /some/path 2>/dev/null但不要为了隐藏报错而忽略真正重要的问题。对系统配置目录进行搜索时,优先确认自己是否具有正确权限。
3. grep 为什么把二进制文件也匹配出来?
可以加 -I 忽略二进制文件:
grep -RIIn '关键字' .对于代码项目,更推荐直接使用 rg:
rg '关键字'4. locate 为什么找不到刚创建的文件?
因为 locate 使用数据库,数据库可能还没有更新。
手动更新:
sudo updatedb刚创建、刚删除或位于未被索引目录中的文件,使用 find 会更可靠。
5. 为什么 find 中的通配符要加引号?
正确写法:
find . -name '*.py'错误写法:
find . -name *.py不加引号时,Shell 会先展开 *.py,导致 find 收到的参数不是你预期的搜索模式。
grep、rg 中的复杂正则也建议使用单引号包裹,以避免 Shell 提前处理特殊字符。
6. 搜索结果中有空格或特殊字符的文件名怎么办?
不要使用这种不安全的组合:
find . -name '*.txt' | xargs rm更可靠的方式:
find . -name '*.txt' -print0 | xargs -0 rm不过删除前仍建议先把 rm 换成 ls -l 检查:
find . -name '*.txt' -print0 | xargs -0 ls -l7. 应该优先用 grep 还是 rg?
如果系统默认已安装、只做简单文本搜索,使用 grep 就足够。
如果你经常写代码、搜索大型项目,建议安装并优先使用 rg:
grep:系统基础工具,几乎所有 Linux 环境都能使用rg :速度快、适合代码项目、默认遵循 .gitignore总结
Linux 搜索工具的关键不是“记住一个万能命令”,而是先根据搜索目标选择工具。
找文件名、时间、大小、权限:find找文件内容:grep快速找已索引的文件名:locate在代码仓库搜索文本:rg查命令实际位置:command -v / type -a / whereis找软件包:apt search日常开发最值得记住的几个命令:
find . -name '*.py'grep -RIn '关键字' .rg '关键字'locate 文件名command -v 命令名apt search 软件包名掌握这几类工具后,无论是找项目文件、排查日志、定位配置,还是分析服务器环境,都会快很多。