前言

这个脚本也是从互联网上获得,但是实际执行的时候,在宝塔任务的输出终端中会出现乱码,所以我移除了彩色字体.原文:

https://cloud.tencent.com/developer/article/2545923

脚本

#!/bin/bash

# Linux 系统盘清理脚本(无颜色输出)
# 功能:清理系统垃圾文件、旧内核、缓存等以释放磁盘空间
# 注意:运行前请确保有管理员权限,部分操作可能需要root权限

# 检查是否为root用户
if [ "$(id -u)" -ne 0 ]; then
    echo "警告: 建议使用root权限运行此脚本以执行所有清理操作"
    read -p "是否继续? (y/n) " -n 1 -r
    echo
    if [[ ! $REPLY =~ ^[Yy]$ ]]; then
        exit 1
    fi
fi

# 显示当前磁盘使用情况
echo
echo "=== 当前磁盘使用情况 ==="
df -h /

# 清理APT缓存
echo
echo "=== 清理APT缓存 ==="
apt-get clean
apt-get autoclean

# 移除不再需要的依赖包
echo
echo "=== 移除不再需要的依赖包 ==="
apt-get autoremove --purge

# 清理旧内核 (保留当前和上一个版本)
echo
echo "=== 清理旧内核 ==="
current_kernel=$(uname -r)
echo "当前内核版本: $current_kernel"
# 获取所有已安装的旧内核镜像和头文件(排除当前内核)
old_kernels=$(dpkg -l linux-{image,headers}-* | awk '/^ii/{print $2}' | grep -vE "$current_kernel|$(echo $current_kernel | sed 's/-generic//')" | sort -u)
if [ -n "$old_kernels" ]; then
    echo "将要清理的旧内核包:"
    echo "$old_kernels"
    read -p "确认删除? (y/N) " -n 1 -r
    echo
    if [[ $REPLY =~ ^[Yy]$ ]]; then
        apt-get purge $old_kernels -y
    else
        echo "跳过旧内核清理"
    fi
else
    echo "未发现可清理的旧内核"
fi

# 清理日志文件 (保留最近7天)
echo
echo "=== 清理日志文件 ==="
find /var/log -type f -name "*.log" -mtime +7 -exec rm -f {} \;
journalctl --vacuum-time=7d

# 清理临时文件
echo
echo "=== 清理临时文件 ==="
find /tmp -type f -atime +7 -delete
find /var/tmp -type f -atime +14 -delete

# 清理缩略图缓存
echo
echo "=== 清理缩略图缓存 ==="
if [ -d "$HOME/.cache/thumbnails" ]; then
    rm -rf "$HOME/.cache/thumbnails"/*
    echo "已清理缩略图缓存"
else
    echo "缩略图缓存目录不存在,跳过"
fi

# 清理浏览器缓存 (Chrome/Firefox)
echo
echo "=== 清理浏览器缓存 ==="
for user in /home/*; do
    if [ -d "$user" ]; then
        username=$(basename "$user")
        echo "正在清理用户: $username"
        # Chrome
        if [ -d "$user/.cache/google-chrome/Default/Cache" ]; then
            rm -rf "$user/.cache/google-chrome/Default/Cache"
            echo "  已清理 Chrome 缓存"
        fi
        if [ -d "$user/.cache/google-chrome/Default/Code Cache" ]; then
            rm -rf "$user/.cache/google-chrome/Default/Code Cache"
            echo "  已清理 Chrome Code Cache"
        fi
        # Firefox
        if [ -d "$user/.cache/mozilla/firefox" ]; then
            find "$user/.cache/mozilla/firefox" -name "cache2" -exec rm -rf {} + 2>/dev/null || true
            echo "  已清理 Firefox 缓存"
        fi
    fi
done

# 清理旧的snap版本
echo
echo "=== 清理旧的snap版本 ==="
if command -v snap &> /dev/null; then
    snap list --all | awk '/disabled/{print $1, $3}' | while read snapname revision; do
        if [ -n "$snapname" ] && [ -n "$revision" ]; then
            snap remove "$snapname" --revision="$revision"
        fi
    done
else
    echo "snap 命令未找到,跳过"
fi

# 清理Docker无用数据
echo
echo "=== 清理Docker无用数据 ==="
if command -v docker &> /dev/null; then
    read -p "确定要清理所有未使用的Docker数据吗? (y/N) " -n 1 -r
    echo
    if [[ $REPLY =~ ^[Yy]$ ]]; then
        docker system prune -af
    else
        echo "跳过 Docker 清理"
    fi
else
    echo "Docker 未安装,跳过"
fi

# 查找大文件 (大于100MB)
echo
echo "=== 查找大文件 (大于100MB,前20个) ==="
find / -xdev -type f -size +100M -exec ls -lh {} \; 2>/dev/null | sort -k5 -rh | head -n 20 || echo "未找到大文件或权限不足"

# 显示清理后的磁盘使用情况
echo
echo "=== 清理后磁盘使用情况 ==="
df -h /

echo
echo "清理完成!"