服务公告

服务公告 > 技术教程 > find 高级表达式:批量运维的组合写法

find 高级表达式:批量运维的组合写法

发布时间:2026-01-01 11:56
## 场景 批量运维的入口几乎都是同一个句式:找出一批符合条件的文件,对它们做同一件事。日志清理要找七天前的旧文件,磁盘排查要找超过一 GB 的大文件,发布校验要找最近一天改动过的配置,权限整改要找全组可写的目录。find 的表达式语法把这些条件组合成一条命令,配合 -exec 把动作接上,一条命令完成一次批量操作。它支持的过滤维度覆盖时间、大小、类型、权限、属主,实际工作中九成的文件定位需求都能在一条表达式里解决,脚本里用得越熟,临时拼接的环节越少。 ## 步骤清单 按时间与类型过滤,找出修改时间超过七天、以 log 结尾的普通文件。 ``` find /var/log/myapp -type f -name "*.log" -mtime +7 ``` 按大小找大文件,磁盘告警时先跑这条。 ``` find /data -type f -size +1G -exec ls -lh {} \; ``` 组合逻辑用感叹号取反、括号分组,例如找出七天外的大文件但排除归档目录。 ``` find /data -type f -size +500M -mtime +7 ! -path "/data/archive/*" ``` ## 验证 批量操作前先把动作换成纯打印跑一遍:删除换成 ls,压缩换成 ls 确认清单。输出与预期一致后,再把真实动作写回去执行。多一条打印这一步,能挡住九成误删事故,代价只是几十秒,尤其是那些带取反与括号分组的复杂表达式,肉眼审阅容易看走眼,实际输出不会骗人。执行后用相同条件再查一次,结果为空即批量处理完整。 ## 注意事项 -exec 每个文件起一个进程,海量文件时用加号结尾的批量模式,一次把多个文件传给命令,速度差出量级。通配符加引号防止被 shell 提前展开,这是新手最常见的坑。删除动作优先用 find 自己的 -delete 而不是接 rm,路径判断在 find 内部完成,少一层管道的转义风险。顺云云服务器上的定时清理任务,把 find 命令固化成脚本并记录每次删除的文件数,长期跑下来清理量的波动本身就是一份磁盘增长档案。