find 是什么
find 从指定目录开始递归遍历,按名称、类型、时间、大小、权限、属主等条件筛选文件,并可以直接对命中的文件执行动作,比如删除、批量改权限或交给其它命令处理。它与 grep 的分工是:find 负责「找出哪些文件」,grep 负责「文件里有什么内容」。清理过期日志、找出占用空间的巨型文件、审计带特殊权限的可执行文件,这些日常任务都靠 find 一次成型。
基本信息
| 所属 | GNU findutils,各 Linux 发行版通用 |
|---|---|
| 语法 | find [起点目录] [条件] [动作] |
| 常用条件 | -name、-type、-mtime、-size、-perm、-user |
| 批量动作 | -exec 命令 {} + 或 -delete |
| 深度控制 | -maxdepth 限制遍历层数,-mindepth 跳过顶层 |
| 性能提示 | 收窄起点目录比加条件更有效 |
典型使用场景
- 清理过期数据:按修改时间找出三十天前的日志或临时文件并删除
- 定位空间占用:先按大小找出大文件,再判断是否可以归档或清理
- 批量改权限:按类型与权限位筛选出目标文件,一次性调整
- 安全审计:查找带特殊权限位的可执行文件,核对是否合理
- 按属主盘点:找出离职账号遗留的文件,重新归属
- 配合打包:把符合条件的文件清单交给归档命令处理
典型用法
典型用法
find /var/log -type f -name '*.log' -mtime +30 # 列出 30 天前的日志
find /var/log -type f -name '*.log' -mtime +30 -delete # 确认清单后再删除
find /data -type f -size +500M -exec ls -lh {} + | head # 找出大于 500M 的文件
find /tmp -maxdepth 1 -type f -name '*.tmp' -mtime +7 # 只查一层,控制开销
find / -perm -4000 -type f 2>/dev/null | head # 审计特殊权限文件
find /backup -type d -mtime +90 # 找长期未更新的目录常用条件读法
| 条件 | 含义 | 写法示例 |
|---|---|---|
| -name | 按文件名匹配,区分大小写 | -name '*.log',加引号防通配符被 shell 展开 |
| -iname | 按文件名匹配,忽略大小写 | -iname '*.LOG' |
| -type | 按类型筛选 | f 普通文件,d 目录,l 符号链接 |
| -mtime | 按修改时间筛选,单位天 | +30 表示 30 天以前,-7 表示 7 天内 |
| -size | 按大小筛选 | +500M 大于,-10k 小于 |
| -perm | 按权限位筛选 | -4000 含特殊权限位 |
| -maxdepth | 限制遍历深度 | 放在起点目录之后才生效 |
带删除动作的命令必须先把动作去掉跑一遍,确认命中清单符合预期再加 -delete 或 -exec。误写的条件一旦命中系统目录,造成的后果无法撤销。
条件顺序会影响效率:把成本低、过滤力度大的条件放前面,例如先按名称和类型筛选,再判断权限或内容。遍历根目录时排除虚拟文件系统能显著减少无效扫描与报错。