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/
作者
SHAO
发布于
2026年5月25日
许可协议