# 找出比当前内核"旧"的最近一个 PREV_KERNEL="" for k in"${ALL_KERNELS[@]}"; do if [[ "$k" == "$CURRENT_KERNEL" ]]; then break fi PREV_KERNEL="$k" done
if [[ -n "$PREV_KERNEL" ]]; then KEEP_LIST+=("$PREV_KERNEL") fi
log"将保留以下内核:" for k in"${KEEP_LIST[@]}"; do printf" ${GREEN}✔${NC} %s\n""$k" done
# ---------- 计算要删除的版本 ---------- DELETE_LIST=() for k in"${ALL_KERNELS[@]}"; do skip=0 for keep in"${KEEP_LIST[@]}"; do if [[ "$k" == "$keep" ]]; then skip=1 break fi done [[ $skip -eq 0 ]] && DELETE_LIST+=("$k") done
if [[ ${#DELETE_LIST[@]} -eq 0 ]]; then ok "没有需要删除的旧内核。" else warn "将删除以下旧内核:" for k in"${DELETE_LIST[@]}"; do printf" ${RED}✘${NC} %s\n""$k" done fi
# ---------- 安全检查:确保当前内核目录存在 ---------- if [[ ! -d "$MODULES_DIR/$CURRENT_KERNEL" ]]; then err "当前内核目录 $MODULES_DIR/$CURRENT_KERNEL 不存在!为安全起见,中止。" exit 1 fi ok "当前内核目录存在,安全检查通过。"
# ---------- 确认 ---------- if [[ $DRY_RUN -eq 1 ]]; then warn "干跑模式(--dry-run),不实际删除。" fi
if [[ $DRY_RUN -eq 0 && $AUTO_YES -eq 0 ]]; then echo read -r -p "确认执行删除?输入 yes 继续: " CONFIRM if [[ "$CONFIRM" != "yes" ]]; then warn "已取消。" exit 0 fi fi
# ---------- 执行删除 ---------- do_rm() { local path="$1" if [[ -e "$path" ]]; then if [[ $DRY_RUN -eq 1 ]]; then echo" [dry-run] rm -rf $path" else rm -rf "$path" echo" 已删除: $path" fi fi }
do_rm_file() { local path="$1" if [[ -e "$path" ]]; then if [[ $DRY_RUN -eq 1 ]]; then echo" [dry-run] rm -f $path" else rm -f "$path" echo" 已删除: $path" fi fi }
if [[ ${#DELETE_LIST[@]} -gt 0 ]]; then echo log"开始删除旧内核..." for k in"${DELETE_LIST[@]}"; do echo"→ 处理内核: $k" do_rm "$MODULES_DIR/$k" do_rm "$MODULES_TRIM_DIR/$k" do_rm_file "$BOOT_DIR/config-$k" do_rm_file "$BOOT_DIR/initrd.img-$k" do_rm_file "$BOOT_DIR/System.map-$k" do_rm_file "$BOOT_DIR/vmlinuz-$k" done ok "旧内核删除完成。" fi