backup_mut.sh

I tant! Afegim l’opció E) Imatge del sistema que ho copia tot (arrel / sencera, exclòs només els sistemes virtuals com /proc, /sys, /dev…). Necessita sudo, perquè hi ha fitxers de sistema que l’usuari normal no pot llegir.

Aquí tens l’script actualitzat sencer:

#!/bin/bash
#====================================================#
#  BACKUP_MUT.SH - Còpia de seguretat i restauració  #
#  Compatible amb Deepin / Ubuntu / Debian           #
#====================================================#

USUARI="$USER"
CASA="$HOME"
DATA="$(date +%Y-%m-%d_%H%M%S)"
CARPETA_BACKUPS="$CASA/Backups"

capcalera() {
    clear
    echo "=========================================="
    echo "  BACKUP_MUT - BACKUP I RESTAURACIÓ"
    echo "=========================================="
    echo
}

tria_origen() {
    echo "Tria el directori ORIGEN:"
    echo "  A) $CASA (tot el directori d'usuari)"
    echo "  B) $CASA/Documents"
    echo "  C) $CASA/Pictures"
    echo "  D) $CASA/Downloads"
    echo "  E) Imatge del sistema (ho copia tot)"
    echo "  S) Firefox i sistema"
    echo "  R) Especificar ruta manualment"
    echo
    read -p "Opció [A/B/C/D/E/S/R]: " o
    case "$o" in
        a|A) ORIGEN="$CASA" ;;
        b|B) ORIGEN="$CASA/Documents" ;;
        c|C) ORIGEN="$CASA/Pictures" ;;
        d|D) ORIGEN="$CASA/Downloads" ;;
        e|E) ORIGEN="__IMATGE__" ;;
        s|S) ORIGEN="__SISTEMA__" ;;
        r|R) read -p "Introdueix la ruta completa del directori: " ORIGEN ;;
        *)   ORIGEN="" ;;
    esac
}

tria_desti() {
    echo
    echo "Tria el DESTÍ de la còpia:"
    echo "  1) $CARPETA_BACKUPS (disc intern)"
    echo "  2) Unitat externa / USB (/media/$USUARI)"
    echo "  3) Especificar ruta manualment"
    read -p "Opció [1-3]: " d
    case "$d" in
        2) echo "   Unitats detectades: $(ls /media/$USUARI 2>/dev/null)"
           read -p "   Nom de la unitat: " disc
           DESTI="/media/$USUARI/$disc/Backups" ;;
        3) read -p "Ruta completa de destí: " DESTI ;;
        *) DESTI="$CARPETA_BACKUPS" ;;
    esac
    mkdir -p "$DESTI" 2>/dev/null
}

fer_backup() {
    echo "--- MODE BACKUP ---"
    echo
    tria_origen

    if [ -z "$ORIGEN" ]; then
        echo "Opció no vàlida."
        return 1
    fi

    tria_desti

    if [ "$ORIGEN" = "__IMATGE__" ]; then
        echo
        echo "ATENCIO: Es copiarà TOT el sistema (excepte /proc, /sys,"
        echo "/dev, /run, /media, /mnt i /tmp)."
        echo "Calen permisos d'administrador (sudo) i pot trigar força."
        echo "Comprova que el destí tingui prou espai lliure!"
        echo
        read -p "Vols continuar? [s/N]: " conf
        if [ "$conf" != "s" ] && [ "$conf" != "S" ]; then
            echo "Operació cancel·lada."
            return 1
        fi
        if ! sudo -v; then
            echo "Error: no s'han obtingut permisos d'administrador."
            return 1
        fi
        FITXER="$DESTI/imatge_sistema_$DATA.tar.gz"
        sudo tar -czpf "$FITXER" \
            --directory=/ \
            --exclude=./proc \
            --exclude=./sys \
            --exclude=./dev \
            --exclude=./run \
            --exclude=./media \
            --exclude=./mnt \
            --exclude=./tmp \
            --exclude=./lost+found \
            --exclude=".${DESTI}" \
            .
    elif [ "$ORIGEN" = "__SISTEMA__" ]; then
        # Perfil de Firefox (deb o Flatpak) + llista de paquets instal·lats
        FF="$CASA/.mozilla/firefox"
        [ -d "$FF" ] || FF="$CASA/.var/app/org.mozilla.firefox/.mozilla/firefox"
        LLISTA="/tmp/llista_paquets_$DATA.txt"
        dpkg --get-selections > "$LLISTA" 2>/dev/null   # Deepin = Debian
        FITXER="$DESTI/backup_firefox_sistema_$DATA.tar.gz"
        tar -czf "$FITXER" "$FF" "$LLISTA"
    else
        if [ ! -e "$ORIGEN" ]; then
            echo "Error: '$ORIGEN' no existeix."
            return 1
        fi
        NOM="$(basename "$ORIGEN")"
        FITXER="$DESTI/backup_${NOM}_$DATA.tar.gz"
        tar -czf "$FITXER" -C "$(dirname "$ORIGEN")" "$NOM" \
            --exclude="Backups" \
            --exclude=".cache" \
            --exclude=".local/share/Trash"
    fi

    if [ $? -eq 0 ]; then
        echo
        echo "Còpia de seguretat creada correctament:"
        echo "  $FITXER ($(du -h "$FITXER" | cut -f1))"
    else
        echo "Error: no s'ha pogut crear la còpia."
    fi
}

restaurar() {
    echo "--- MODE RESTAURACIÓ ---"
    echo
    echo "On vols buscar les còpies?"
    echo "  1) $CARPETA_BACKUPS (disc intern)"
    echo "  2) Especificar carpeta manualment"
    read -p "Opció [1-2]: " o
    CARPETA="$CARPETA_BACKUPS"
    [ "$o" = "2" ] && read -p "Carpeta: " CARPETA

    echo
    echo "Còpies disponibles:"
    ls -1 "$CARPETA"/*.tar.gz 2>/dev/null | cat -n
    echo
    read -p "Número de la còpia a restaurar: " num
    FITXER="$(ls -1 "$CARPETA"/*.tar.gz 2>/dev/null | sed -n "${num}p")"

    if [ ! -f "$FITXER" ]; then
        echo "Error: no s'ha trobat la còpia."
        return 1
    fi

    # Cas especial: imatge completa del sistema
    case "$(basename "$FITXER")" in
        imatge_sistema*)
            echo
            echo "ATENCIO: Es sobreescriuran els fitxers del sistema actual."
            echo "Recomanat fer-ho des d'un Live USB."
            read -p "Vols continuar? [s/N]: " conf
            if [ "$conf" = "s" ] || [ "$conf" = "S" ]; then
                sudo tar -xzpf "$FITXER" -C / && echo "Imatge del sistema restaurada."
            else
                echo "Operació cancel·lada."
            fi
            return 0
            ;;
    esac

    read -p "On vols restaurar-ho? [$CASA]: " DEST
    [ -z "$DEST" ] && DEST="$CASA"
    mkdir -p "$DEST"

    if tar -xzf "$FITXER" -C "$DEST"; then
        echo "Restauració completada a: $DEST"
        echo "(Els fitxers queden dins la seva subcarpeta original)"
    else
        echo "Error durant la restauració."
    fi
}

#==================== PROGRAMA PRINCIPAL ====================
while true; do
    capcalera
    echo "1) Fer còpia de seguretat (backup)"
    echo "2) Restaurar còpia de seguretat"
    echo "3) Sortir"
    echo
    read -p "Tria una opció [1-3]: " op

    case "$op" in
        1) fer_backup ;;
        2) restaurar ;;
        3) echo "Adéu!"; exit 0 ;;
        *) echo "Opció no vàlida" ;;
    esac

    echo
    read -p "Prem ENTER per continuar..."
done

Per actualitzar el teu fitxer:

nano ~/.local/bin/backup_mut.sh
# (enganxa el codi nou, Ctrl+O per desar, Ctrl+X per sortir)
backup_mut.sh

Notes sobre l’opció E:

  • Et demanarà la contrasenya de sudo abans de començar.
  • Pot trigar molt de temps (depèn de la mida del disc) i el fitxer serà gran; millor desar-lo en un disc extern amb prou espai.
  • S’exclouen /proc, /sys, /dev, /run, /media, /mnt i /tmp perquè són sistemes virtuals o temporals que no s’han de copiar.
  • El fitxer .tar.gz resultant serà de propietat root (es crea amb sudo), però el podràs llegir i restaurar sense problemes.
  • La restauració de la imatge completa es fa sobre / i demana confirmació; idealment s’hauria de fer des d’un Live USB.