Skip to content

Instantly share code, notes, and snippets.

@hightemp
Last active April 7, 2026 08:12
Show Gist options
  • Select an option

  • Save hightemp/e7faa96f6ecbdfdcb21608001b1d1fee to your computer and use it in GitHub Desktop.

Select an option

Save hightemp/e7faa96f6ecbdfdcb21608001b1d1fee to your computer and use it in GitHub Desktop.
Скрипт сброса ubuntu до состояния читой системы

Что делает скрипт

Скрипт охватывает все слои загрязнения системы, которые остаются после обычного использования:

📦 APT-пакеты

Сравнивает текущий список вручную установленных пакетов с эталоном /var/log/installer/initial-status.gz — это файл, который Ubuntu записывает при первой установке. Если файл отсутствует (например, на сервере с cloud-image), используется aptitude + apt-mark showmanual как фолбэк. После — apt autoremove --purge, чистка rc-конфигов через dpkg --purge, и deborphan для библиотек-сирот. oneuptime

🔵 Snap / Flatpak

Удаляет все snap-пакеты кроме core* и snapd, и все Flatpak-приложения.

🐍🟢🦀🐹 Языковые экосистемы

Очищает пользовательские установки вне APT — это самая часто забываемая часть: github

Экосистема Что чистится
Python pip --user, pipx, venv/virtualenvs, ~/.local/lib/python*
Node.js npm -g, nvm, volta, pnpm, yarn global
Rust rustup self uninstall, затем ~/.cargo, ~/.rustup manpages.ubuntu
Go ~/go, /usr/local/go toolchain

📁 /usr/local и /opt

Очищает содержимое всех стандартных подкаталогов (bin, lib, include, share, sbin) и нестандартных папок в /opt — именно туда ставятся ручные ./configure && make install и installer'ы. bbs.archlinux

🏠 Домашняя папка

Удаляет ~/.config, ~/.local, ~/.cache, ~/.var и ~70 конкретных dotfiles (.gitconfig, .ssh, .docker, .kube, .terraform.d, .vscode, .idea, .cargo, .oh-my-zsh и т.д.), после чего восстанавливает дефолтные файлы из /etc/skel. fostips

🔧 Прочее

  • Crontab пользователя и root
  • Пользовательские systemd-юниты
  • PPA и сторонние GPG-ключи из /etc/apt/sources.list.d/

Запуск

# Сначала проверь что будет удалено (ничего не трогает)
sudo bash ubuntu-reset.sh --dry-run

# Запуск с подтверждением
sudo bash ubuntu-reset.sh

# Запуск без интерактивного подтверждения (например, в CI)
sudo bash ubuntu-reset.sh --yes

# Указать конкретного пользователя
sudo bash ubuntu-reset.sh --user=john

Что добавилось с флагом --reset-home:

Без --reset-home (поведение по умолчанию, как раньше) — удаляются только конфиги, dotfiles и кэши. Папки ~/Documents, ~/Downloads, ~/Pictures, ~/Videos, ~/Music и все личные файлы сохраняются.

С --reset-homefind $HOME -mindepth 1 -exec rm -rf {} + удаляет абсолютно всё содержимое домашней папки (включая скрытые файлы), после чего восстанавливает структуру из /etc/skel. Добавлено второе интерактивное подтверждение — нужно ввести RESET HOME (если не передан --yes), чтобы случайно не потерять данные.

# Мягкая очистка (личные файлы целы):
sudo bash ubuntu-reset.sh

# Полный сброс home до /etc/skel:
sudo bash ubuntu-reset.sh --reset-home

# Полный сброс без вопросов (CI/скрипты):
sudo bash ubuntu-reset.sh --reset-home --yes

# Предварительный просмотр:
sudo bash ubuntu-reset.sh --reset-home --dry-run

⚠️ Важные предупреждения

  1. /etc/apt/sources.list — скрипт не трогает этот файл (только .d/), проверь его вручную если добавлял репозитории напрямую
  2. /etc/systemd/system/ — пакетные юниты не трогаются, но добавленные вручную .service файлы нужно удалить руками
  3. На cloud-образах без initial-status.gz метод определения "вручную установленных" менее точен — рекомендуется проверить /tmp/pkgs_to_remove.txt перед реальным запуском
  4. После сброса обязательно сделай sudo reboot
#!/usr/bin/env bash
# =============================================================================
# ubuntu-reset.sh — Сброс Ubuntu до состояния "только что установлена"
#
# ВНИМАНИЕ: Этот скрипт НЕОБРАТИМО удаляет данные. Сделайте бэкап заранее.
#
# Запуск:
# sudo bash ubuntu-reset.sh [ОПЦИИ]
#
# Опции:
# --dry-run Показать что будет сделано, ничего не удалять
# --yes Не спрашивать подтверждения
# --user=USERNAME Указать пользователя (по умолчанию — вызвавший sudo)
# --reset-home ПОЛНЫЙ сброс home: удалить ВСЁ включая документы,
# загрузки и личные файлы, восстановить только /etc/skel
# (без этого флага личные файлы сохраняются)
#
# Без --reset-home сохраняется:
# ~/Documents, ~/Downloads, ~/Pictures, ~/Videos, ~/Music, ~/Desktop
# (удаляются только конфиги, кэши, dotfiles)
#
# С --reset-home удаляется:
# АБСОЛЮТНО ВСЁ в /home/<user>/, затем восстанавливается из /etc/skel
# =============================================================================
set -euo pipefail
# ─── Цвета ───────────────────────────────────────────────────────────────────
RED='\033[0;31m'
YEL='\033[1;33m'
GRN='\033[0;32m'
BLU='\033[0;34m'
NC='\033[0m'
log() { echo -e "${BLU}[INFO]${NC} $*"; }
warn() { echo -e "${YEL}[WARN]${NC} $*"; }
ok() { echo -e "${GRN}[ OK ]${NC} $*"; }
err() { echo -e "${RED}[ERR ]${NC} $*" >&2; }
# ─── Параметры ───────────────────────────────────────────────────────────────
DRY_RUN=false
AUTO_YES=false
RESET_HOME=false
TARGET_USER="${SUDO_USER:-$(logname 2>/dev/null || echo '')}"
for arg in "$@"; do
case "$arg" in
--dry-run) DRY_RUN=true ;;
--yes) AUTO_YES=true ;;
--reset-home) RESET_HOME=true ;;
--user=*) TARGET_USER="${arg#--user=}" ;;
esac
done
# ─── Проверки ─────────────────────────────────────────────────────────────────
if [[ $EUID -ne 0 ]]; then
err "Скрипт должен запускаться через sudo: sudo bash $0"
exit 1
fi
if [[ -z "$TARGET_USER" ]]; then
err "Не удалось определить целевого пользователя. Укажи --user=USERNAME"
exit 1
fi
if ! id "$TARGET_USER" &>/dev/null; then
err "Пользователь '$TARGET_USER' не существует."
exit 1
fi
USER_HOME=$(getent passwd "$TARGET_USER" | cut -d: -f6)
# ─── Режим dry-run ───────────────────────────────────────────────────────────
run() {
if $DRY_RUN; then
echo -e "${YEL}[DRY-RUN]${NC} $*"
else
eval "$@"
fi
}
# ─── Подтверждение ───────────────────────────────────────────────────────────
echo ""
echo -e "${RED}╔══════════════════════════════════════════════════════════════╗${NC}"
echo -e "${RED}║ ⚠ ДЕСТРУКТИВНАЯ ОПЕРАЦИЯ ⚠ ║${NC}"
echo -e "${RED}╚══════════════════════════════════════════════════════════════╝${NC}"
echo ""
echo -e " Целевой пользователь : ${YEL}${TARGET_USER}${NC}"
echo -e " Домашняя папка : ${YEL}${USER_HOME}${NC}"
echo -e " Режим dry-run : ${YEL}${DRY_RUN}${NC}"
echo -e " Полный сброс home : ${YEL}${RESET_HOME}${NC}"
echo ""
if $RESET_HOME; then
echo -e "${RED} !! ФЛАГ --reset-home АКТИВЕН !!${NC}"
echo -e "${RED} Будет удалено ВСЁ содержимое ${USER_HOME}/${NC}"
echo -e "${RED} включая Documents, Downloads, Pictures и все личные файлы!${NC}"
echo ""
fi
warn "Все вручную установленные пакеты, configs и пользовательский мусор будут удалены."
warn "РЕКОМЕНДУЕТСЯ сделать бэкап перед запуском."
echo ""
if ! $AUTO_YES; then
read -rp "Продолжить? Введи 'YES' для подтверждения: " CONFIRM
if [[ "$CONFIRM" != "YES" ]]; then
echo "Отменено."
exit 0
fi
fi
# =============================================================================
# 1. ПАКЕТЫ APT — удаление вручную установленных
# =============================================================================
log "=== [1/9] Обнаружение вручную установленных APT-пакетов ==="
MANUALLY_INSTALLED=()
INITIAL_PKGS_FILE=""
if [[ -f /var/log/installer/initial-status.gz ]]; then
INITIAL_PKGS_FILE=$(mktemp)
gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u > "$INITIAL_PKGS_FILE"
log "Использую /var/log/installer/initial-status.gz как эталон"
fi
MANUAL_PKG_FILE=$(mktemp)
apt-mark showmanual | sort -u > "$MANUAL_PKG_FILE"
if [[ -n "$INITIAL_PKGS_FILE" ]]; then
comm -23 "$MANUAL_PKG_FILE" "$INITIAL_PKGS_FILE" > /tmp/pkgs_to_remove.txt || true
[[ -s "$INITIAL_PKGS_FILE" ]] && rm -f "$INITIAL_PKGS_FILE"
else
warn "initial-status.gz не найден, используем aptitude fallback"
if command -v aptitude &>/dev/null; then
aptitude search '~i !~M' -F '%p' | sed 's/ *$//' | sort -u > /tmp/pkgs_to_remove.txt
else
cp "$MANUAL_PKG_FILE" /tmp/pkgs_to_remove.txt
fi
fi
rm -f "$MANUAL_PKG_FILE"
PKG_COUNT=$(wc -l < /tmp/pkgs_to_remove.txt)
log "Найдено пакетов для удаления: ${PKG_COUNT}"
if [[ $PKG_COUNT -gt 0 ]]; then
log "Список сохранён в /tmp/pkgs_to_remove.txt"
if ! $DRY_RUN; then
cat /tmp/pkgs_to_remove.txt | xargs -r sudo apt-get purge -y --ignore-missing 2>/dev/null || true
ok "APT-пакеты удалены"
else
warn "[DRY-RUN] Будет удалено: $(cat /tmp/pkgs_to_remove.txt | tr '\n' ' ')"
fi
fi
run "apt-get autoremove --purge -y"
run "apt-get clean"
RC_PKGS=$(dpkg -l | awk '/^rc/{print $2}' | tr '\n' ' ')
if [[ -n "$RC_PKGS" ]]; then
log "Очистка конфиг-остатков (rc-статус): $RC_PKGS"
run "dpkg --purge $RC_PKGS"
fi
if command -v deborphan &>/dev/null; then
log "Запуск deborphan для удаления библиотек-сирот..."
PASSES=0
while [[ -n "$(deborphan 2>/dev/null)" ]] && [[ $PASSES -lt 5 ]]; do
run "deborphan | xargs apt-get -y remove --purge"
PASSES=$((PASSES + 1))
done
ok "deborphan завершён ($PASSES проходов)"
else
warn "deborphan не установлен, пропускаем (можно поставить: apt install deborphan)"
fi
# =============================================================================
# 2. SNAP — удаление всех snap кроме базовых
# =============================================================================
log "=== [2/9] Snap пакеты ==="
SNAP_KEEP=("core" "core18" "core20" "core22" "core24" "snapd" "bare")
if command -v snap &>/dev/null; then
SNAP_LIST=$(snap list 2>/dev/null | awk 'NR>1 {print $1}')
for snap_pkg in $SNAP_LIST; do
KEEP=false
for keep in "${SNAP_KEEP[@]}"; do
[[ "$snap_pkg" == "$keep" ]] && KEEP=true && break
done
if ! $KEEP; then
log "Удаляю snap: $snap_pkg"
run "snap remove --purge '$snap_pkg'"
fi
done
ok "Snap-пакеты очищены"
else
warn "snap не установлен, пропускаем"
fi
# =============================================================================
# 3. FLATPAK — удаление всех пользовательских приложений
# =============================================================================
log "=== [3/9] Flatpak пакеты ==="
if command -v flatpak &>/dev/null; then
FLATPAK_APPS=$(flatpak list --app --columns=application 2>/dev/null || true)
if [[ -n "$FLATPAK_APPS" ]]; then
run "flatpak uninstall --all -y"
ok "Flatpak-приложения удалены"
else
log "Flatpak-приложений нет"
fi
else
warn "flatpak не установлен, пропускаем"
fi
# =============================================================================
# 4. PYTHON — pip, pipx, virtualenvs
# =============================================================================
log "=== [4/9] Python (pip/pipx/virtualenvs) ==="
for pip_cmd in pip3 pip; do
if sudo -u "$TARGET_USER" command -v $pip_cmd &>/dev/null 2>&1; then
PIP_PKGS=$(sudo -u "$TARGET_USER" $pip_cmd list --user --format=freeze 2>/dev/null | cut -d= -f1 || true)
if [[ -n "$PIP_PKGS" ]]; then
log "Удаляю user pip-пакеты через $pip_cmd..."
run "sudo -u '$TARGET_USER' $pip_cmd uninstall -y $PIP_PKGS 2>/dev/null || true"
fi
break
fi
done
if sudo -u "$TARGET_USER" command -v pipx &>/dev/null 2>&1; then
PIPX_PKGS=$(sudo -u "$TARGET_USER" pipx list --short 2>/dev/null | awk '{print $1}' || true)
for pkg in $PIPX_PKGS; do
run "sudo -u '$TARGET_USER' pipx uninstall '$pkg' 2>/dev/null || true"
done
fi
for pydir in "$USER_HOME"/.local/lib/python*/site-packages; do
[[ -d "$pydir" ]] && run "rm -rf '$pydir'"
done
for venv_dir in "$USER_HOME"/.venv "$USER_HOME"/venv "$USER_HOME"/.virtualenvs; do
[[ -d "$venv_dir" ]] && run "rm -rf '$venv_dir'"
done
ok "Python окружение очищено"
# =============================================================================
# 5. NODE.JS — npm global, nvm, volta, pnpm, yarn
# =============================================================================
log "=== [5/9] Node.js (npm/nvm/volta/pnpm/yarn) ==="
if command -v npm &>/dev/null; then
NPM_GLOBALS=$(npm list -g --depth=0 --parseable 2>/dev/null | tail -n +2 | xargs -I{} basename {} || true)
for pkg in $NPM_GLOBALS; do
[[ "$pkg" == "npm" ]] && continue
run "npm uninstall -g '$pkg' 2>/dev/null || true"
done
fi
if sudo -u "$TARGET_USER" command -v npm &>/dev/null 2>&1; then
NPM_USER_GLOBALS=$(sudo -u "$TARGET_USER" npm list -g --depth=0 --parseable 2>/dev/null | tail -n +2 | xargs -I{} basename {} || true)
for pkg in $NPM_USER_GLOBALS; do
[[ "$pkg" == "npm" ]] && continue
run "sudo -u '$TARGET_USER' npm uninstall -g '$pkg' 2>/dev/null || true"
done
fi
[[ -d "$USER_HOME/.nvm" ]] && run "rm -rf '$USER_HOME/.nvm'"
[[ -d "$USER_HOME/.volta" ]] && run "rm -rf '$USER_HOME/.volta'"
[[ -d "$USER_HOME/.local/share/pnpm" ]] && run "rm -rf '$USER_HOME/.local/share/pnpm'"
[[ -d "$USER_HOME/.config/yarn" ]] && run "rm -rf '$USER_HOME/.config/yarn'"
ok "Node.js окружение очищено"
# =============================================================================
# 6. RUST (rustup, cargo)
# =============================================================================
log "=== [6/9] Rust (rustup/cargo) ==="
RUSTUP_HOME_DIR="${USER_HOME}/.rustup"
CARGO_HOME_DIR="${USER_HOME}/.cargo"
if [[ -f "$CARGO_HOME_DIR/bin/rustup" ]]; then
log "Удаляю Rust через rustup self uninstall..."
run "sudo -u '$TARGET_USER' RUSTUP_HOME='$RUSTUP_HOME_DIR' CARGO_HOME='$CARGO_HOME_DIR' '$CARGO_HOME_DIR/bin/rustup' self uninstall -y 2>/dev/null || true"
fi
[[ -d "$RUSTUP_HOME_DIR" ]] && run "rm -rf '$RUSTUP_HOME_DIR'"
[[ -d "$CARGO_HOME_DIR" ]] && run "rm -rf '$CARGO_HOME_DIR'"
ok "Rust удалён"
# =============================================================================
# 7. GO — установки через go install
# =============================================================================
log "=== [7/9] Go (~/go, /usr/local/go) ==="
GO_USER_DIR="${USER_HOME}/go"
GO_SYSTEM_DIR="/usr/local/go"
[[ -d "$GO_USER_DIR" ]] && run "rm -rf '$GO_USER_DIR'" && ok "~/go удалён"
[[ -d "$GO_SYSTEM_DIR" ]] && run "rm -rf '$GO_SYSTEM_DIR'" && ok "/usr/local/go удалён"
if [[ -f "/usr/local/bin/go" ]] || [[ -L "/usr/local/bin/go" ]]; then
run "rm -f /usr/local/bin/go /usr/local/bin/gofmt"
fi
# =============================================================================
# 8. /usr/local и /opt — нестандартные установки
# =============================================================================
log "=== [8/9] /usr/local и /opt — ручные установки ==="
USR_LOCAL_DIRS=(bin sbin lib lib64 include share man)
for subdir in "${USR_LOCAL_DIRS[@]}"; do
TARGET_DIR="/usr/local/$subdir"
if [[ -d "$TARGET_DIR" ]]; then
log "Очистка /usr/local/$subdir..."
run "find '$TARGET_DIR' -mindepth 1 -delete 2>/dev/null || true"
fi
done
for item in /usr/local/*; do
basename_item=$(basename "$item")
case "$basename_item" in
bin|sbin|lib|lib64|include|share|man|src|games|etc) continue ;;
*)
log "Удаляю нестандартное: /usr/local/$basename_item"
run "rm -rf '/usr/local/$basename_item'"
;;
esac
done
if [[ -d "/opt" ]]; then
for item in /opt/*; do
[[ -e "$item" ]] || continue
log "Удаляю /opt/$(basename $item)..."
run "rm -rf '$item'"
done
fi
ok "/usr/local и /opt очищены"
# =============================================================================
# 9. ДОМАШНЯЯ ПАПКА
# =============================================================================
log "=== [9/9] Очистка домашней папки: $USER_HOME ==="
if $RESET_HOME; then
# -------------------------------------------------------------------------
# ПОЛНЫЙ СБРОС HOME: удалить абсолютно всё, восстановить из /etc/skel
# -------------------------------------------------------------------------
log "Режим ПОЛНОГО сброса home (--reset-home)..."
# Дополнительное подтверждение, если не передан --yes
if ! $AUTO_YES && ! $DRY_RUN; then
echo ""
echo -e "${RED}ПОСЛЕДНЕЕ ПРЕДУПРЕЖДЕНИЕ!${NC}"
echo -e "Будет уничтожено ВСЁ содержимое ${YEL}${USER_HOME}/${NC}"
echo -e "включая документы, фото, загрузки и все личные файлы."
read -rp "Подтверди полный сброс home. Введи 'RESET HOME' : " CONFIRM2
if [[ "$CONFIRM2" != "RESET HOME" ]]; then
warn "Полный сброс home отменён. Переходим к мягкой очистке конфигов."
RESET_HOME=false
fi
fi
fi
if $RESET_HOME; then
if $DRY_RUN; then
warn "[DRY-RUN] Будет выполнено: rm -rf ${USER_HOME}/{*,.[!.]*,..?*}"
warn "[DRY-RUN] Будет выполнено: cp -rT /etc/skel '${USER_HOME}'"
else
log "Удаляем все файлы и папки в ${USER_HOME}/ ..."
# Удаляем всё: видимые файлы/папки и скрытые (dotfiles)
find "$USER_HOME" -mindepth 1 -maxdepth 1 -exec rm -rf {} +
log "Восстанавливаем структуру из /etc/skel..."
cp -rT /etc/skel "$USER_HOME"
chown -R "${TARGET_USER}:${TARGET_USER}" "$USER_HOME"
ok "Home полностью сброшен до состояния /etc/skel"
fi
else
# -------------------------------------------------------------------------
# МЯГКАЯ ОЧИСТКА: удалить конфиги/кэши, сохранить личные файлы
# -------------------------------------------------------------------------
log "Режим мягкой очистки (личные файлы сохраняются)..."
# Конфигурационные каталоги
CONFIG_DIRS=(
".config"
".local/share"
".local/state"
".cache"
".var"
)
for dir in "${CONFIG_DIRS[@]}"; do
FULL_PATH="$USER_HOME/$dir"
if [[ -d "$FULL_PATH" ]]; then
log "Очистка $FULL_PATH..."
run "rm -rf '$FULL_PATH'"
fi
done
# Восстановление базовых dotfiles из /etc/skel
log "Восстановление базовых dotfiles из /etc/skel..."
run "cp -rT /etc/skel '$USER_HOME'"
run "chown -R '$TARGET_USER:$TARGET_USER' '$USER_HOME'"
# Конкретные dotfiles
DOTFILES_TO_REMOVE=(
".bash_history" ".python_history" ".mysql_history" ".psql_history"
".lesshst" ".wget-hsts" ".node_repl_history" ".rediscli_history"
".dbshell" ".mongodbshell" ".gitconfig" ".gitcredentials"
".ssh" ".gnupg" ".npmrc" ".yarnrc" ".yarnrc.yml" ".pnpmfile.cjs"
".cargo" ".rustup" ".go" ".gradle" ".m2" ".ivy2" ".sbt"
".stack" ".ghc" ".cabal" ".rbenv" ".rvm" ".gem" ".bundle"
".nix-profile" ".nix-channels" ".nix-defexpr"
".docker" ".kube" ".minikube" ".terraform.d" ".vagrant.d" ".ansible"
".dbus" ".dconf" ".gconf" ".gnome2" ".kde"
".mozilla" ".thunderbird" ".wine"
".java" ".android" ".idea" ".vscode" ".vscode-server" ".cursor" ".continue"
".zsh_history" ".oh-my-zsh" ".zsh" ".tmux" ".tmux.conf"
".vim" ".vimrc" ".emacs" ".emacs.d"
".composer" ".symfony" ".platformsh" ".heroku"
".aws" ".azure" ".gcloud"
)
for dotfile in "${DOTFILES_TO_REMOVE[@]}"; do
FULL_PATH="$USER_HOME/$dotfile"
if [[ -e "$FULL_PATH" ]] || [[ -L "$FULL_PATH" ]]; then
run "rm -rf '$FULL_PATH'"
fi
done
ok "Конфиги домашней папки очищены (личные файлы сохранены)"
fi
# ─── Crontab ─────────────────────────────────────────────────────────────────
log "Очистка crontab..."
run "crontab -r 2>/dev/null || true"
run "sudo -u '$TARGET_USER' crontab -r 2>/dev/null || true"
# ─── Пользовательские systemd-юниты ─────────────────────────────────────────
SYSTEMD_USER_DIR="$USER_HOME/.config/systemd/user"
if [[ -d "$SYSTEMD_USER_DIR" ]]; then
log "Удаление пользовательских systemd-юнитов..."
run "rm -rf '$SYSTEMD_USER_DIR'"
fi
if ! $DRY_RUN; then
warn "Проверь /etc/systemd/system/ вручную на предмет добавленных юнитов"
fi
# ─── Репозитории APT ─────────────────────────────────────────────────────────
log "Сброс APT-репозиториев к дефолтным (удаление PPA)..."
if ! $DRY_RUN; then
find /etc/apt/sources.list.d/ \( -name "*.list" -o -name "*.sources" \) 2>/dev/null | \
grep -v "official-package-repositories" | xargs -r rm -f
find /etc/apt/trusted.gpg.d/ \( -name "*.gpg" -o -name "*.asc" \) 2>/dev/null | \
grep -v "ubuntu-keyring" | xargs -r rm -f 2>/dev/null || true
ok "PPA и сторонние репозитории удалены"
else
warn "[DRY-RUN] PPA в /etc/apt/sources.list.d/ будут удалены"
fi
# ─── Финальное обновление ─────────────────────────────────────────────────────
log "Обновление apt-индексов..."
run "apt-get update -qq"
# =============================================================================
echo ""
echo -e "${GRN}╔══════════════════════════════════════════════════════════════╗${NC}"
echo -e "${GRN}║ ✓ СБРОС ЗАВЕРШЁН ║${NC}"
echo -e "${GRN}╚══════════════════════════════════════════════════════════════╝${NC}"
echo ""
log "Сводка:"
log " - Вручную установленные apt-пакеты: ${PKG_COUNT} удалено"
log " - Snap, Flatpak, pip, npm, Rust, Go: очищены"
log " - /usr/local/*, /opt/*: очищены"
if $RESET_HOME; then
log " - Домашняя папка ($USER_HOME): ПОЛНОСТЬЮ сброшена до /etc/skel"
else
log " - Домашняя папка ($USER_HOME): конфиги удалены, личные файлы сохранены"
fi
log " - Crontab и системные PPA: удалены"
echo ""
warn "Рекомендуется перезагрузить систему: sudo reboot"
echo ""
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment