find 比 rm -rf 更安全,因其可按时间、后缀、大小精准过滤,避免误删关键文件;需慎用通配符、首次加-print测试,并禁用-delete改用-exec rm。

为什么 find 比 rm -rf 直接删目录更安全
项目运行久了,runtime/cache、storage/logs、node_modules/.cache 这类路径下会堆积大量小文件(.log、.tmp、.swp、.lock),直接 rm -rf 整个目录风险极高——一不小心写错路径,可能清掉 storage/app 里的上传文件或数据库迁移记录。find 能精准按时间、后缀、大小过滤,先看清楚再动手。
- 推荐用
-mtime +7清理 7 天前的旧日志,避免误删当天调试产生的关键.log - 慎用
-name "*.*"——它会匹配所有带点的文件,包括.env或.gitignore,应明确写成-name "*.log" -o -name "*.tmp" - 首次运行前务必加
-print测试,例如:find /www/wwwroot/myapp/runtime/cache -name "*.php" -mtime +3 -print
宝塔面板里怎么让 Shell 脚本识别 PHP/Python 环境变量
在宝塔终端手动执行脚本没问题,但加入定时任务后常报错 command not found: php 或 ModuleNotFoundError: No module named 'requests'——因为宝塔定时任务默认使用 /bin/sh,不加载用户 profile,也找不到宝塔安装的 PHP(如 /www/server/php/81/bin/php)或 Python(如 /www/server/python/bin/python3)。
- 脚本开头必须显式声明解释器和环境路径,例如:
#!/bin/bash+export PATH="/www/server/php/81/bin:/www/server/python/bin:$PATH" - 调用 PHP 命令时别写
php xxx.php,改用绝对路径:/www/server/php/81/bin/php /www/wwwroot/myapp/artisan optimize:clear - 如果脚本依赖 pip 包,先确认包装在宝塔 Python 环境里:
/www/server/python/bin/pip3 install requests
定时任务里如何避免多个清理脚本同时跑崩磁盘 IO
宝塔面板允许添加多个定时任务,但若几个项目清理脚本都在凌晨 2:00 启动,find 扫描 + rm 删除会集中冲击磁盘,导致网站响应变慢甚至 502。这不是脚本写得不对,而是并发控制缺失。
- 给每个脚本加随机延迟:在脚本开头插入
sleep $((RANDOM % 300))(最多延后 5 分钟) - 用
pgrep -f "cleanup_script.sh" | wc -l判断是否已有实例在运行,是则直接 exit - 宝塔定时任务设置为每小时执行一次(
0 * * * *),比每天一次更平滑;具体清理逻辑由脚本内判断:只在周日凌晨才清storage/logs,其他时间只清cache
清理前必须保留的三个检查点
碎片文件清理不是“越狠越好”。曾有用户清完 runtime/compile 导致 ThinkPHP 模板全白屏,因为框架依赖这些缓存文件加速渲染;也有清掉 public/assets 的哈希文件,前端资源 404。
- 确认项目框架是否启用「编译缓存」:Laravel 查
config/cache.php的store配置,ThinkPHP 查runtime/compile是否被.gitignore排除 - 检查
public/下是否存在由构建工具(Vite/Webpack)生成的assets/目录,这类文件不能删,应交由 CI/CD 流程重建 - 生产环境禁用
find ... -delete,统一用-exec rm {} \;——前者在某些旧版 find 中不支持原子删除,后者可捕获单个文件删除失败的错误
真正麻烦的从来不是写几行命令,而是搞清哪个 runtime 目录能删、哪个是框架心跳文件、哪个 .log 正被 supervisor 实时追加——多看一眼 lsof -p $(pgrep -f 'php-fpm') | grep log,比盲目清库强十倍。











