首页  

find grep 文件查找和索索     所属分类 linux 浏览量 17
find 和 grep 是 Linux/Unix 系统中最常用的 文件搜索与内容检索工具,
二者功能互补:
find 专注于按文件属性(如名称、大小、修改时间)查找文件 / 目录,
grep 专注于在文件内容中匹配指定字符串或正则表达式 

根据需求灵活选择 find、grep 或二者组合:
若需 “找文件”,用 find;
若需 “找内容”,用 grep;
若需 “精准筛选文件后找内容”,则组合使用。



find:按文件属性搜索文件 / 目录
find 的核心是遍历指定目录树,
根据用户设定的条件(如文件名、大小、权限等)筛选文件 / 目录,
支持实时搜索(而非依赖索引),结果更精准但速度受目录规模影响

find [搜索路径] [搜索条件] [执行动作]

搜索路径:默认是当前目录(.),可指定多个路径(如 find /home /var ...)
搜索条件:筛选文件的规则(如名称、类型、大小等),可组合多个条件 
执行动作:对匹配的文件执行操作(如打印路径、删除、复制等),默认动作是 print(打印文件路径)


用 -name 或 -iname(忽略大小写),支持通配符:
*:匹配任意长度的字符(包括空字符)
?:匹配单个字符
[]:匹配括号内的任意一个字符(如 [abc] 匹配 a/b/c)

查找当前目录下所有 .txt 文件	find . -name "*.txt"	注意通配符需用引号包裹,避免 Shell 提前解析
查找 /home 下所有以 log 结尾的文件(忽略大小写)	find /home -iname "*log"	匹配 log/Log/LOG 等
查找 /etc 下路径包含 network 的文件	find /etc -path "*network*"	    -path 匹配完整路径(而非仅文件名)


用 -type 指定文件类型,常见类型:

f:普通文件(文本、二进制等)
d:目录
l:符号链接
s:套接字文件
c:字符设备文件(如 /dev/tty)
b:块设备文件(如 /dev/sda)


查找 /var 下所有目录	find /var -type d
查找当前目录下所有普通文件(排除目录 / 链接)	find . -type f
查找 /usr/bin 下所有符号链接	find /usr/bin -type l



用 -size 指定大小,单位:
b:字节(默认,可省略)
k:千字节(1k=1024b)
M:兆字节
G:吉字节

前缀符号:
+:大于指定大小
-:小于指定大小
无符号:等于指定大小


查找当前目录下大于 100MB 的文件	find . -size +100M
查找 /tmp 下小于 1KB 的文件	find /tmp -size -1k
查找 /home 下大小恰好为 512 字节的文件	find /home -size 512


按修改时间搜索
Linux 文件有三种时间属性,find 支持按这些时间筛选:

mtime:文件内容最后修改时间(最常用)
ctime:文件属性(权限、所有者)最后修改时间
atime:文件最后访问时间

单位是 “天”,前缀 +/- 含义:
+n:超过 n 天未修改 / 访问
-n:n 天内修改 / 访问
n:恰好 n 天前修改 / 访问


查找 /var/log 下 7 天内修改过的 .log 文件	find /var/log -name "*.log" -mtime -7
查找 /home 下 30 天未访问过的文件	find /home -type f -atime +30
查找 /etc 下 1 天前(昨天)修改过的目录	find /etc -type d -mtime 1
若需按 “分钟” 筛选,用 -mmin/-cmin/-amin(如 -mmin -30 表示 30 分钟内修改)


按权限 / 所有者搜索
按权限:用 -perm,支持数字权限(如 755)或符号权限(如 u=rwx)
按所有者:用 -user(用户名)或 -group(组名)


查找 /usr/bin 下权限为 755 的文件	find /usr/bin -type f -perm 755
查找当前目录下所有者为 root 的文件	find . -user root
查找 /home 下所属组为 staff 的目录	find /home -type d -group staff


常用执行动作
默认动作是 print(打印文件路径),也可指定其他动作:
-ls:以 ls -l 格式显示文件详情(权限、大小、修改时间等)


find . -name "*.sh" -ls  # 显示所有.sh文件的详细信息


-exec:对匹配的文件执行指定命令(需用 {} 代指匹配的文件,以 \; 结尾)

# 删除 /tmp 下 30 天前的 .tmp 文件(-delete 是更简洁的删除动作)
find /tmp -name "*.tmp" -mtime +30 -exec rm -f {} \;
# 或更简单:find /tmp -name "*.tmp" -mtime +30 -delete


-ok:与 -exec 类似,但执行前会提示确认(避免误操作)

find . -name "*.bak" -ok rm -f {} \;  # 删除.bak文件前确认


grep(Global Regular Expression Print)的核心是检索文件内容, 匹配指定的字符串或正则表达式,并输出包含匹配内容的行 支持多文件搜索、正则匹配、大小写忽略等功能 grep [选项] "搜索模式" [文件/目录] 搜索模式:可是普通字符串(如 error)或正则表达式(如 ^error,匹配以 error 开头的行) 文件 / 目录:指定要搜索的文件;若为目录,需配合 -r 选项递归搜索目录下所有文件 无选项 搜索文件中包含指定字符串的行 grep "error" app.log 输出 app.log 中所有含 "error" 的行 -i 忽略大小写 grep -i "Error" app.log 匹配 "error"/"Error"/"ERROR" 等 -v 反向匹配(输出不包含指定字符串的行) grep -v "debug" app.log 输出 app.log 中不含 "debug" 的行 -n 显示匹配行的行号 grep -n "warning" app.log 输出行号 + 匹配内容(如 123: warning: low memory) 多文件 同时搜索多个文件 grep "timeout" app.log server.log 搜索 app.log 和 server.log -r/-R 递归搜索目录下所有文件 grep -r "user=admin" /var/log/ 递归搜索 /var/log 下所有文件中含 "user=admin" 的行 -l 仅显示包含匹配内容的文件名(不显示具体行) grep -rl "import pandas" /home/code/ 找出 /home/code 下所有含 "import pandas" 的 Python 文件 -L 反向显示不包含匹配内容的文件名 grep -rL "test" /home/code/ 找出 /home/code 下不含 "test" 的文件 grep 默认支持基础正则表达式(BRE),若需更复杂的匹配(如 +/?/()), 需用 -E 选项启用扩展正则表达式(ERE)(等同于 egrep 命令) 匹配以 "start" 开头的行 grep "^start" app.log ^ 表示行首 匹配以 "end" 结尾的行 grep "end$" app.log $ 表示行尾 匹配包含 3 个数字的行 grep -E "[0-9]{3}" app.log [0-9] 匹配数字,{3} 表示重复 3 次 匹配包含 "user=" 且后面跟任意字符的行 grep "user=.*" app.log .* 匹配任意长度的任意字符 显示匹配行的上下文 -A n 显示匹配行及后面 n 行 grep -A 2 "error" app.log 显示 error 行 + 后续 2 行 -B n 显示匹配行及前面 n 行 grep -B 1 "warning" app.log 显示 warning 行 + 前面 1 行 -C n 显示匹配行及前后 n 行(Context) grep -C 3 "critical" app.log 显示 critical 行 + 前后各 3 行
find 与 grep 组合:精准定位内容 find 擅长找 “文件”,grep 擅长找 “内容”,二者结合可实现 **“先按属性筛选文件, 再在这些文件中搜索内容”**,比单独用 grep -r 更灵活(如限定文件类型、修改时间) find [搜索路径] [文件筛选条件] -exec grep [grep选项] "搜索内容" {} + {} +:与 -exec {} \; 类似,但会将多个匹配文件一次性传给 grep,效率更高(避免多次调用 grep)。 查找 /home 下 7 天内修改过的 .py 文件,且内容包含 "def main (" find /home -type f -name "*.py" -mtime -7 -exec grep -n "def main(" {} + 查找 /var/log 下权限为 644 的 .log 文件,且内容包含 "timeout"(忽略大小写) find /var/log -type f -name "*.log" -perm 644 -exec grep -i "timeout" {} + 查找当前目录下大于 10KB 的文本文件(排除二进制文件),且内容包含 "TODO" find . -type f -size +10k -exec grep -l "TODO" {} + -l 仅显示含 "TODO" 的文件名,避免输出大量内容 递归搜索指定目录下的所有 .txt 文件,并列出包含 "hello" 的文件名 find . -type f -name "*.txt" -exec grep -l "hello" {} \; {} 是一个占位符,代表 find 命令找到的每一个文件路径 \; -exec 选项的终止符,用于告诉 find 命令:-exec 后面的命令到此结束 其中 ; 是实际的终止符号,而 \ 是转义字符,作用是防止 shell 提前解析 ; -type f:限定搜索对象为普通文件 -name "*.txt":匹配所有 .txt 文件 -exec:对匹配到的文件执行后续命令 grep -l "指定内容":在文件中搜索指定内容,并仅输出包含该内容的文件名 -l:仅显示匹配的文件名,不显示具体内容
find 与 grep 核心区别 维度 find grep 搜索对象 文件 / 目录本身(按属性筛选) 文件内容(按字符串 / 正则匹配) 核心目标 找到 “符合条件的文件路径” 找到 “包含指定内容的行” 常用场景 清理旧文件、查找大文件、按类型找文件 日志分析、代码检索、配置文件内容定位 依赖索引 不依赖(实时遍历目录树) 不依赖(实时读取文件内容)
linux之grep命令 Linux查找命令使用及其区别 grep 日志搜索技巧

上一篇     下一篇
mybatisplus IService 与 BaseMapper 的区别

LLM本质上是“猜词”系统,它根本看不懂世界

docker 命令实战 单台物理机上使用 Docker 部署 Java 应用、Redis、MySQL、PostgreSQL 和 MinIO

Spring AI + Milvus 实现 RAG 智能问答