本文目录导读:

- 文件系统:清理未使用的文件/文件夹
- Docker:清理未使用的容器、镜像、卷
- Git:清理未关联的远程分支(Stale Branches)
- 前端构建:清理未使用的样式/组件
- 数据库:清理无外键关联的孤立记录
- Linux 系统:清理无冗余库依赖
- AWS S3:清理未通过 CDN 引用的文件
- ⚠️ 关键注意事项
- 推荐自动化编排工具
清理未关联资源(如孤立文件、未使用的变量、僵尸对象、无引用的资源等)是提升系统性能、降低存储成本的关键维护手段,具体实现方式取决于你正在清理的资源类型(如文件系统、Docker、Git仓库、数据库或前端构建产物)。
以下是针对不同场景的自动化脚本清理方案及核心逻辑:
文件系统:清理未使用的文件/文件夹
场景:用户上传的临时文件、日志缓存、备份文件等未被任何数据库记录引用的文件。
核心逻辑:遍历目录 → 对比数据库或索引记录 → 删除差异项。
示例脚本(Python + Shell):
#!/bin/bash
# 清理 uploads/ 目录下未被数据库记录的图片
DB_IMAGES=$(mysql -u root -p'password' -e "SELECT filename FROM media" -N)
UPLOAD_DIR="/var/www/uploads"
for file in "$UPLOAD_DIR"/*; do
filename=$(basename "$file")
if ! echo "$DB_IMAGES" | grep -q "$filename"; then
echo "Deleting orphan file: $file"
rm -f "$file"
fi
done
Python版本(更可控):
import os, mysql.connector
# 获取已记录的文件名
conn = mysql.connector.connect(host='...', user='root', password='...', database='myapp')
cursor = conn.cursor()
cursor.execute("SELECT filename FROM media")
recorded = set(row[0] for row in cursor.fetchall())
# 扫描目录
upload_dir = "/var/www/uploads"
for f in os.listdir(upload_dir):
if f not in recorded:
os.remove(os.path.join(upload_dir, f))
print(f"Deleted {f}")
Docker:清理未使用的容器、镜像、卷
场景:停止的容器、<none> 悬空镜像、未被任何容器引用的卷。
自动化脚本:
#!/bin/bash # 清理所有未使用的 Docker 资源(容器、镜像、网络、卷) docker system prune -a -f --volumes # 或仅清理特定类型 # docker image prune -a -f # 清理所有未使用的镜像 # docker volume prune -f # 清理未使用的卷 # docker container prune -f # 清理停止的容器
定时任务(cron):
# 每天凌晨 3 点执行 0 3 * * * /usr/bin/docker system prune -a -f --volumes >> /var/log/docker_cleanup.log 2>&1
Git:清理未关联的远程分支(Stale Branches)
场景:远程仓库中已被删除的分支,但在本地仍存在引用。
自动化脚本:
#!/bin/bash
# 方法1:自动 prune(推荐)
git remote prune origin
# 方法2:强制删除本地所有已不存在于远程的分支
git fetch --prune
git branch -r | awk '{print $1}' | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk '{print $1}' | xargs git branch -D
前端构建:清理未使用的样式/组件
场景:大型前端项目中,有些 CSS 类或组件文件不再被任何页面引用。
推荐工具:
- PurifyCSS(已停止维护,推荐 PurgeCSS)
- UnCSS
自动化脚本(npm script):
{
"scripts": {
"clean:unused-css": "purgecss --css build/*.css --content build/*.html --output build/cleaned/"
}
}
CodeQL / SonarQube:用于检测未使用的 JavaScript/TypeScript 变量或 import。
数据库:清理无外键关联的孤立记录
场景:用户删除后,其冗余的地址记录、文章被删后遗留的评论未被删除。
SQL + Shell 脚本:
#!/bin/bash # 清理用户表中已删除用户对应的地址表孤立记录 mysql -u root -p'password' -e " DELETE FROM addresses WHERE user_id NOT IN (SELECT id FROM users); "
更复杂的递归清理:
-- 清理无关联文章的所有评论 DELETE FROM comments WHERE article_id NOT IN (SELECT id FROM articles);
Linux 系统:清理无冗余库依赖
场景:apt-get 或 yum 留下的未使用依赖包。
自动化脚本:
# Debian/Ubuntu sudo apt-get autoremove -y sudo apt-get autoclean -y # CentOS/RHEL sudo yum autoremove -y
AWS S3:清理未通过 CDN 引用的文件
场景:S3 存储桶中存储了文件,但从未被任何日志记录下载。
Python(boto3)脚本:
import boto3
from datetime import datetime, timedelta
s3 = boto3.client('s3')
bucket = 'my-bucket'
# 获取所有未被访问超过 90 天的对象
objects = s3.list_objects_v2(Bucket=bucket)['Contents']
for obj in objects:
last_accessed = obj['LastModified']
if datetime.now() - last_accessed > timedelta(days=90):
print(f"Deleting {obj['Key']}")
s3.delete_object(Bucket=bucket, Key=obj['Key'])
⚠️ 关键注意事项
| 风险类型 | 预防措施 |
|---|---|
| 误删 | 始终先用 -dry-run 模拟执行,确认结果。先移动到回收站或备份目录,而非直接删除。 对 rm、docker prune 等破坏性操作添加 -v 日志。 |
| 性能影响 | 对大目录使用 find -mtime 增量扫描。设置执行频率(如每天凌晨低峰期)。 对 S3/数据库等云服务,注意 API 调用次数限制。 |
| 依赖关系 | 数据库清理:先检查外键约束,使用 ON DELETE CASCADE 简化。Docker: prune 操作可能影响共享的 volume,确认无其他容器使用。 |
| 权限安全 | 脚本应使用 最小权限服务账号(非 root),如仅对特定目录有 r+w 权限。 |
推荐自动化编排工具
- Ansible / SaltStack:批量管理多个服务器,定义清理 playbook。
- Jenkins / GitLab CI:定期执行清理 pipeline,并发送成功/失败通知。
- Rundeck:可视化运维,支持审批和回滚。
- Kubernetes CronJob:在 K8s 集群内定期清理未使用的 PVC、旧镜像。
终极建议:任何自动化清理脚本都应先在一个测试环境中运行至少一周,验证不会破坏业务逻辑,再部署到生产环境。