find 命令实战:从入门到精准定位
基本结构
find 的语法可以概括为一句:在哪些路径下,按什么条件,做什么动作。
find <路径> <条件表达式> <动作>
不写动作时默认是 -print,这也是它最常被用到的形态。
按时间定位
这是排障中最高频的用法——「最近改过什么」。
# 最近 24 小时内修改过的文件
find /etc -type f -mtime -1
# 超过 30 天未访问过的日志
find /var/log -type f -atime +30 -name "*.log"
# 精确到分钟:最近 10 分钟内的变更
find /opt/app -type f -mmin -10
-mtime 的粒度是天,-mmin 是分钟。做变更回溯时建议直接用 -mmin,避免跨天边界误判。
按大小定位
磁盘告警时,第一步永远是找出谁在占空间。
# 大于 100M 的文件,按大小倒序
find / -xdev -type f -size +100M -exec ls -lh {} + | sort -k5 -hr | head -20
# 小于 10K 的碎片文件(清理临时产物)
find /tmp -type f -size -10k -delete
注意 -xdev:它阻止 find 跨越挂载点。扫描根目录时务必加上,否则会走进 /proc、网络存储等不该碰的地方。
按权限与属主定位
安全检查与权限修复的常见场景。
# 找出全局可写的文件(安全隐患)
find /var/www -type f -perm -0002 -ls
# 找出属主为 nobody 的文件
find /data -nouser -o -nogroup
# 批量修复权限
find /var/www/html -type d -exec chmod 755 {} +
find /var/www/html -type f -exec chmod 644 {} +
动作:-exec 与 -delete
为什么用 {} + 而不是 {} \;
| 写法 |
行为 |
性能 |
-exec cmd {} \; |
每个文件启动一次进程 |
慢 |
-exec cmd {} + |
批量拼接后一次执行 |
快 |
修复一万个文件的权限时,两者差距可能是几分钟与几毫秒的区别。
危险动作的正确姿势
-delete 会立即删除且不进回收站。安全的做法是先 空跑一遍看命中列表:
# 第一步:只打印,确认范围
find /data/tmp -type f -mtime +7 -print
# 第二步:确认无误后删除
find /data/tmp -type f -mtime +7 -delete
组合条件
-a(与,默认)、-o(或)、!(非)三者可以嵌套,但要注意优先级。
# 找出 .log 或 .tmp 且大于 50M 的文件
find /var -type f \( -name "*.log" -o -name "*.tmp" \) -size +50M
括号必须转义(\( \)),否则会被 shell 解释。这是最常见的语法错误。
小结
- 排障场景:优先
-mmin + -type f,快速锁定变更。
- 磁盘场景:
-xdev + -size +N + sort -hr,定位大文件。
- 批量操作:
-exec {} + 提性能,-delete 前必空跑。