{"id":18621,"date":"2026-08-03T06:53:43","date_gmt":"2026-08-03T04:53:43","guid":{"rendered":"https:\/\/www.beseit.net\/?p=18621"},"modified":"2026-08-03T06:56:41","modified_gmt":"2026-08-03T04:56:41","slug":"backup_mut-sh","status":"publish","type":"post","link":"https:\/\/www.beseit.net\/?p=18621","title":{"rendered":"backup_mut.sh"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">I tant! Afegim l&#8217;opci\u00f3 <strong>E) Imatge del sistema<\/strong> que ho copia tot (arrel <code>\/<\/code> sencera, excl\u00f2s nom\u00e9s els sistemes virtuals com <code>\/proc<\/code>, <code>\/sys<\/code>, <code>\/dev<\/code>\u2026). Necessita <code>sudo<\/code>, perqu\u00e8 hi ha fitxers de sistema que l&#8217;usuari normal no pot llegir.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Aqu\u00ed tens l&#8217;script actualitzat sencer:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#!\/bin\/bash\n#====================================================#\n#  BACKUP_MUT.SH - C\u00f2pia de seguretat i restauraci\u00f3  #\n#  Compatible amb Deepin \/ Ubuntu \/ Debian           #\n#====================================================#\n\nUSUARI=\"$USER\"\nCASA=\"$HOME\"\nDATA=\"$(date +%Y-%m-%d_%H%M%S)\"\nCARPETA_BACKUPS=\"$CASA\/Backups\"\n\ncapcalera() {\n    clear\n    echo \"==========================================\"\n    echo \"  BACKUP_MUT - BACKUP I RESTAURACI\u00d3\"\n    echo \"==========================================\"\n    echo\n}\n\ntria_origen() {\n    echo \"Tria el directori ORIGEN:\"\n    echo \"  A) $CASA (tot el directori d'usuari)\"\n    echo \"  B) $CASA\/Documents\"\n    echo \"  C) $CASA\/Pictures\"\n    echo \"  D) $CASA\/Downloads\"\n    echo \"  E) Imatge del sistema (ho copia tot)\"\n    echo \"  S) Firefox i sistema\"\n    echo \"  R) Especificar ruta manualment\"\n    echo\n    read -p \"Opci\u00f3 [A\/B\/C\/D\/E\/S\/R]: \" o\n    case \"$o\" in\n        a|A) ORIGEN=\"$CASA\" ;;\n        b|B) ORIGEN=\"$CASA\/Documents\" ;;\n        c|C) ORIGEN=\"$CASA\/Pictures\" ;;\n        d|D) ORIGEN=\"$CASA\/Downloads\" ;;\n        e|E) ORIGEN=\"__IMATGE__\" ;;\n        s|S) ORIGEN=\"__SISTEMA__\" ;;\n        r|R) read -p \"Introdueix la ruta completa del directori: \" ORIGEN ;;\n        *)   ORIGEN=\"\" ;;\n    esac\n}\n\ntria_desti() {\n    echo\n    echo \"Tria el DEST\u00cd de la c\u00f2pia:\"\n    echo \"  1) $CARPETA_BACKUPS (disc intern)\"\n    echo \"  2) Unitat externa \/ USB (\/media\/$USUARI)\"\n    echo \"  3) Especificar ruta manualment\"\n    read -p \"Opci\u00f3 [1-3]: \" d\n    case \"$d\" in\n        2) echo \"   Unitats detectades: $(ls \/media\/$USUARI 2>\/dev\/null)\"\n           read -p \"   Nom de la unitat: \" disc\n           DESTI=\"\/media\/$USUARI\/$disc\/Backups\" ;;\n        3) read -p \"Ruta completa de dest\u00ed: \" DESTI ;;\n        *) DESTI=\"$CARPETA_BACKUPS\" ;;\n    esac\n    mkdir -p \"$DESTI\" 2>\/dev\/null\n}\n\nfer_backup() {\n    echo \"--- MODE BACKUP ---\"\n    echo\n    tria_origen\n\n    if [ -z \"$ORIGEN\" ]; then\n        echo \"Opci\u00f3 no v\u00e0lida.\"\n        return 1\n    fi\n\n    tria_desti\n\n    if [ \"$ORIGEN\" = \"__IMATGE__\" ]; then\n        echo\n        echo \"ATENCIO: Es copiar\u00e0 TOT el sistema (excepte \/proc, \/sys,\"\n        echo \"\/dev, \/run, \/media, \/mnt i \/tmp).\"\n        echo \"Calen permisos d'administrador (sudo) i pot trigar for\u00e7a.\"\n        echo \"Comprova que el dest\u00ed tingui prou espai lliure!\"\n        echo\n        read -p \"Vols continuar? [s\/N]: \" conf\n        if [ \"$conf\" != \"s\" ] &amp;&amp; [ \"$conf\" != \"S\" ]; then\n            echo \"Operaci\u00f3 cancel\u00b7lada.\"\n            return 1\n        fi\n        if ! sudo -v; then\n            echo \"Error: no s'han obtingut permisos d'administrador.\"\n            return 1\n        fi\n        FITXER=\"$DESTI\/imatge_sistema_$DATA.tar.gz\"\n        sudo tar -czpf \"$FITXER\" \\\n            --directory=\/ \\\n            --exclude=.\/proc \\\n            --exclude=.\/sys \\\n            --exclude=.\/dev \\\n            --exclude=.\/run \\\n            --exclude=.\/media \\\n            --exclude=.\/mnt \\\n            --exclude=.\/tmp \\\n            --exclude=.\/lost+found \\\n            --exclude=\".${DESTI}\" \\\n            .\n    elif [ \"$ORIGEN\" = \"__SISTEMA__\" ]; then\n        # Perfil de Firefox (deb o Flatpak) + llista de paquets instal\u00b7lats\n        FF=\"$CASA\/.mozilla\/firefox\"\n        [ -d \"$FF\" ] || FF=\"$CASA\/.var\/app\/org.mozilla.firefox\/.mozilla\/firefox\"\n        LLISTA=\"\/tmp\/llista_paquets_$DATA.txt\"\n        dpkg --get-selections > \"$LLISTA\" 2>\/dev\/null   # Deepin = Debian\n        FITXER=\"$DESTI\/backup_firefox_sistema_$DATA.tar.gz\"\n        tar -czf \"$FITXER\" \"$FF\" \"$LLISTA\"\n    else\n        if [ ! -e \"$ORIGEN\" ]; then\n            echo \"Error: '$ORIGEN' no existeix.\"\n            return 1\n        fi\n        NOM=\"$(basename \"$ORIGEN\")\"\n        FITXER=\"$DESTI\/backup_${NOM}_$DATA.tar.gz\"\n        tar -czf \"$FITXER\" -C \"$(dirname \"$ORIGEN\")\" \"$NOM\" \\\n            --exclude=\"Backups\" \\\n            --exclude=\".cache\" \\\n            --exclude=\".local\/share\/Trash\"\n    fi\n\n    if [ $? -eq 0 ]; then\n        echo\n        echo \"C\u00f2pia de seguretat creada correctament:\"\n        echo \"  $FITXER ($(du -h \"$FITXER\" | cut -f1))\"\n    else\n        echo \"Error: no s'ha pogut crear la c\u00f2pia.\"\n    fi\n}\n\nrestaurar() {\n    echo \"--- MODE RESTAURACI\u00d3 ---\"\n    echo\n    echo \"On vols buscar les c\u00f2pies?\"\n    echo \"  1) $CARPETA_BACKUPS (disc intern)\"\n    echo \"  2) Especificar carpeta manualment\"\n    read -p \"Opci\u00f3 [1-2]: \" o\n    CARPETA=\"$CARPETA_BACKUPS\"\n    [ \"$o\" = \"2\" ] &amp;&amp; read -p \"Carpeta: \" CARPETA\n\n    echo\n    echo \"C\u00f2pies disponibles:\"\n    ls -1 \"$CARPETA\"\/*.tar.gz 2>\/dev\/null | cat -n\n    echo\n    read -p \"N\u00famero de la c\u00f2pia a restaurar: \" num\n    FITXER=\"$(ls -1 \"$CARPETA\"\/*.tar.gz 2>\/dev\/null | sed -n \"${num}p\")\"\n\n    if [ ! -f \"$FITXER\" ]; then\n        echo \"Error: no s'ha trobat la c\u00f2pia.\"\n        return 1\n    fi\n\n    # Cas especial: imatge completa del sistema\n    case \"$(basename \"$FITXER\")\" in\n        imatge_sistema*)\n            echo\n            echo \"ATENCIO: Es sobreescriuran els fitxers del sistema actual.\"\n            echo \"Recomanat fer-ho des d'un Live USB.\"\n            read -p \"Vols continuar? [s\/N]: \" conf\n            if [ \"$conf\" = \"s\" ] || [ \"$conf\" = \"S\" ]; then\n                sudo tar -xzpf \"$FITXER\" -C \/ &amp;&amp; echo \"Imatge del sistema restaurada.\"\n            else\n                echo \"Operaci\u00f3 cancel\u00b7lada.\"\n            fi\n            return 0\n            ;;\n    esac\n\n    read -p \"On vols restaurar-ho? [$CASA]: \" DEST\n    [ -z \"$DEST\" ] &amp;&amp; DEST=\"$CASA\"\n    mkdir -p \"$DEST\"\n\n    if tar -xzf \"$FITXER\" -C \"$DEST\"; then\n        echo \"Restauraci\u00f3 completada a: $DEST\"\n        echo \"(Els fitxers queden dins la seva subcarpeta original)\"\n    else\n        echo \"Error durant la restauraci\u00f3.\"\n    fi\n}\n\n#==================== PROGRAMA PRINCIPAL ====================\nwhile true; do\n    capcalera\n    echo \"1) Fer c\u00f2pia de seguretat (backup)\"\n    echo \"2) Restaurar c\u00f2pia de seguretat\"\n    echo \"3) Sortir\"\n    echo\n    read -p \"Tria una opci\u00f3 [1-3]: \" op\n\n    case \"$op\" in\n        1) fer_backup ;;\n        2) restaurar ;;\n        3) echo \"Ad\u00e9u!\"; exit 0 ;;\n        *) echo \"Opci\u00f3 no v\u00e0lida\" ;;\n    esac\n\n    echo\n    read -p \"Prem ENTER per continuar...\"\ndone<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Per actualitzar el teu fitxer:<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">nano ~\/.local\/bin\/backup_mut.sh\n# (enganxa el codi nou, Ctrl+O per desar, Ctrl+X per sortir)\nbackup_mut.sh<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Notes sobre l&#8217;opci\u00f3 E:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Et demanar\u00e0 la contrasenya de <code>sudo<\/code> abans de comen\u00e7ar.<\/li>\n\n\n\n<li>Pot trigar <strong>molt de temps<\/strong> (dep\u00e8n de la mida del disc) i el fitxer ser\u00e0 gran; millor desar-lo en un disc extern amb prou espai.<\/li>\n\n\n\n<li>S&#8217;exclouen <code>\/proc<\/code>, <code>\/sys<\/code>, <code>\/dev<\/code>, <code>\/run<\/code>, <code>\/media<\/code>, <code>\/mnt<\/code> i <code>\/tmp<\/code> perqu\u00e8 s\u00f3n sistemes virtuals o temporals que no s&#8217;han de copiar.<\/li>\n\n\n\n<li>El fitxer <code>.tar.gz<\/code> resultant ser\u00e0 de propietat root (es crea amb sudo), per\u00f2 el podr\u00e0s llegir i restaurar sense problemes.<\/li>\n\n\n\n<li>La restauraci\u00f3 de la imatge completa es fa sobre <code>\/<\/code> i demana confirmaci\u00f3; idealment s&#8217;hauria de fer des d&#8217;un Live USB.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>I tant! Afegim l&#8217;opci\u00f3 E) Imatge del sistema que ho copia tot (arrel \/ sencera, excl\u00f2s nom\u00e9s els sistemes virtuals com \/proc, \/sys, \/dev\u2026). Necessita sudo, perqu\u00e8 hi ha fitxers de sistema que l&#8217;usuari normal no pot llegir. Aqu\u00ed tens &hellip; <a href=\"https:\/\/www.beseit.net\/?p=18621\">Continua llegint <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":3167,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[207,1],"tags":[],"class_list":["post-18621","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deepin-linux","category-bloc-de-notes"],"_links":{"self":[{"href":"https:\/\/www.beseit.net\/index.php?rest_route=\/wp\/v2\/posts\/18621","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.beseit.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.beseit.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.beseit.net\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.beseit.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=18621"}],"version-history":[{"count":1,"href":"https:\/\/www.beseit.net\/index.php?rest_route=\/wp\/v2\/posts\/18621\/revisions"}],"predecessor-version":[{"id":18622,"href":"https:\/\/www.beseit.net\/index.php?rest_route=\/wp\/v2\/posts\/18621\/revisions\/18622"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.beseit.net\/index.php?rest_route=\/wp\/v2\/media\/3167"}],"wp:attachment":[{"href":"https:\/\/www.beseit.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=18621"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.beseit.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=18621"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.beseit.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=18621"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}