2.3 搜索与查找——find 和 grep
搜索与查找——find 和 grep
📋 命令执行总结
find 命令(按条件搜索文件)
| 分类 | 参数 | 作用 | 示例 |
|---|---|---|---|
| 按文件名 | -name |
精确匹配文件名(区分大小写) | find . -name "*.txt" |
-iname |
忽略大小写匹配文件名 | find . -iname "README*" |
|
| 按类型 | -type f |
普通文件 | find . -type f -name "*.log" |
-type d |
目录 | find . -type d -name "backup*" |
|
-type l |
符号链接 | find . -type l |
|
| 按大小 | -size +100M |
大于 100MB | find / -type f -size +10M |
-size -10k |
小于 10KB | find . -type f -size -1k |
|
-size 1G |
正好 1GB | find . -size 1G |
|
| 按时间 | -mtime +n |
n 天前修改 | find . -mtime +30 |
-mtime -n |
n 天内修改 | find . -mtime -7 |
|
-mmin -60 |
60 分钟内修改 | find . -mmin -60 |
|
-atime |
访问时间 | find . -atime -3 |
|
-ctime |
状态改变时间 | find . -ctime -3 |
|
| 组合条件 | -a 或空格 |
与(AND) | find . -size +1M -a -mtime -7 |
-o |
或(OR) | find . -name "*.txt" -o -name "*.log" |
|
! 或 -not |
非(NOT) | find . ! -name "*.txt" |
|
| 执行操作 | -exec |
对找到的文件执行命令 | find . -name "*.tmp" -exec rm {} \; |
grep 命令(搜索文件内容)
| 选项 | 含义 | 示例 |
|---|---|---|
-i |
忽略大小写 | grep -i "error" log.txt |
-v |
反向匹配(显示不包含的行) | grep -v "debug" log.txt |
-n |
显示行号 | grep -n "error" log.txt |
-c |
只统计匹配的行数 | grep -c "error" log.txt |
-l |
只显示包含匹配的文件名 | grep -l "root" *.conf |
-L |
只显示不包含匹配的文件名 | grep -L "root" *.conf |
-r / -R |
递归搜索目录 | grep -r "localhost" /etc/ |
-w |
匹配整个单词 | grep -w "the" file.txt |
-A n |
显示匹配行及后面 n 行 | grep -A 3 "error" log.txt |
-B n |
显示匹配行及前面 n 行 | grep -B 3 "error" log.txt |
-C n |
显示匹配行及前后各 n 行 | grep -C 2 "error" log.txt |
--color |
高亮匹配的文本 | grep --color "error" log.txt |
-E |
使用扩展正则表达式 | grep -E "[0-9]+" file.txt |
grep 正则表达式(需配合 -E)
| 符号 | 含义 | 示例 |
|---|---|---|
. |
匹配任意单个字符 | grep "a.c" 匹配 aac、abc、a1c |
* |
匹配前一个字符 0 或多次 | grep "a*" 匹配空、a、aa |
.* |
匹配任意多个任意字符 | grep "a.*b" 匹配 a 开头 b 结尾 |
^ |
行首 | grep "^root" 匹配以 root 开头的行 |
$ |
行尾 | grep "bash$" 匹配以 bash 结尾的行 |
[0-9] |
数字 | grep "[0-9]" 匹配包含数字的行 |
[a-z] |
小写字母 | grep "^[a-z]" 以小写字母开头的行 |
{n} |
重复 n 次 | grep -E "a{3}" 匹配 aaa |
🧠 知识点总结
核心概念
find 与 grep 的区别
find:在文件系统中搜索文件名,按名称、类型、大小、时间等属性查找grep:在文件内容中搜索文本,按字符串或正则匹配查找- 两者常组合使用:
find找到目标文件,grep在这些文件中搜索内容
find 的特点
- 实时搜索磁盘,速度较慢但结果准确
- 支持复杂的条件组合(与、或、非)
-exec可对搜索结果执行任意命令,批量操作非常强大
grep 的特点
- 支持多种正则表达式语法(基础、扩展、Perl)
- 递归搜索(
-r)可遍历整个目录 - 常与管道配合:
command | grep "pattern"
正则表达式要点
.匹配任意单个字符(除换行符)*修饰前一个字符,表示 0 或多次,不是通配符的*.*才是通配符意义上的”匹配任意长度”- 特殊字符如需匹配字面值,需用
\转义:\.匹配点号
📁 系统/文件/环境信息
常用搜索路径
| 路径 | 用途 |
|---|---|
/ |
根目录(全系统搜索,需要 root 权限) |
/etc/ |
配置文件目录 |
/var/log/ |
日志文件目录 |
/home/ |
用户家目录 |
. |
当前目录 |
~ |
当前用户家目录 |
🔐 权限 / 用户 / 系统机制说明
搜索权限注意事项
find搜索时遇到无权限目录会报错,可用2>/dev/null屏蔽grep -r递归搜索时同样受权限限制- 搜索
/根目录时建议使用sudo,否则大量权限错误
2>/dev/null 的作用
- 屏蔽错误输出(如”Permission denied”)
- 让输出更干净,只显示有结果的内容
- 示例:
find / -name "*.conf" 2>/dev/null
-exec 与 xargs 的区别
| 方式 | 特点 | 示例 |
|---|---|---|
-exec {} \; |
每个文件执行一次命令,速度慢 | find . -name "*.txt" -exec ls {} \; |
-exec {} + |
批量传递文件,效率高 | find . -name "*.txt" -exec rm {} + |
xargs |
更灵活,可控制并行 | find . -name "*.txt" | xargs grep "hello" |
📌 补充说明
重要提醒
- 通配符要加引号:
find . -name "*.txt"中的*.txt必须加引号,否则 shell 会先展开 - -exec 结尾格式:
{}前后有空格,\;中的反斜杠不能少 - grep 递归区别:
-r用于目录,不加则只能搜索单个文件 - 正则 vs 通配符:grep 用正则(
.,*,^,$),find -name 用通配符(*,?)
实用组合命令
| 场景 | 命令 |
|---|---|
| 删除所有空文件 | find . -type f -empty -exec rm {} \; |
| 查找大文件 | find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null |
| 搜索配置文件中的特定配置 | find /etc -name "*.conf" -exec grep -H "Listen" {} \; |
| 统计代码行数 | find . -name "*.py" -exec cat {} \; | wc -l |
| 批量重命名 | find . -name "*.old" | sed 's/\.old$/.new/' | xargs -n2 mv |
| 查找包含特定内容的文件 | grep -rl "password" /etc/ 2>/dev/null |
2.3 搜索与查找——find 和 grep
https://blog.sh462li.top/2026/05/25/2.3 搜索与查找——find-和-grep/