Appunti di vita in ordine sparso

Comprimere in modo automatico più cartelle

Cartelle da comprimereSupponiamo di avere più cartelle all’interno di una directory su una macchina Windows e di volerle archiviare tramite un automatismo (senza dover far clic su ognuna, dire “comprimi”, ecc.). Pensa, per esempio, a dei file di log generati da un programma, salvati nella cartella corrispondente al mese, o al giorno del mese. Pensa di dover pianificare l’esecuzione di questo processo in automatico, su un server. E non vuoi avere un unico file zip compresso, bensì un file compresso per ogni cartella. Bene. Sapresti come fare?

C’è un sistema molto semplice e veloce che ti permette di raggiungere il tuo scopo.

Prima di tutto scarica il programma 7-Zip per la gestione dei file compressi (software open source molto leggero, disponibile in versione x86 a 32-bit e 64-bit) ed installalo. Se vuoi far si che i file di archivio compressi (zip, rar, arj, tar.. ed il formato specifico 7z) vengano aperti in automatico con 7-Zip sul tuo PC, basta che apri il programma, vai sul menu Strumenti, Opzioni e selezioni le estensioni che vuoi associare.

Verifica a che percorso hai installato il software sul tuo PC (verosimilmente potrebbe essere C:\Program Files\7-Zip).

Ora apri un editor di testo (Notepad di Windows va benissimo, anche se mi piace pensare che tu conosci ed usi Notepad++). In un file vuoto scrivi (modificando, eventualmente, il percorso all’interno del quale si trova l’eseguibile 7z.exe):

for /d %%X in (*) do "C:\Program Files\7-Zip\7z.exe" a "%%X.7z" "%%X\"

Cosa significa? Lo script non fa altro che prendere ogni cartella contenuta nel percorso in cui si esegue il file batch e passarla come parametro all’eseguibile di 7-Zip, creando un file compresso che avrà lo stesso nome della cartella.

Salva questo file, facendo attenzione a salvarlo con estensione .bat, anziché .txt (un file txt è un file di testo, mentre un bat è uno script batch, un file eseguibile); chiamalo, per esempio, comprimi.bat e salvalo nel percorso dove hai le varie cartelle che vuoi archiviare. Attenzione: puoi decidere di archiviare le tue cartelle in formato .zip, anziché .7z semplicemente modificando l’estensione.

Cartelle salvate come file compressiNon ti resta che eseguire il file batch comprimi.bat. Si aprirà una finestra di prompt di MS-DOS, dove verrà lanciato lo script; una volta terminata l’esecuzione ti troverai nella tua cartella tanti file compressi, quante sono le sotto-cartelle. In questo esempio, trattandosi di file di testo txt (quindi altamente comprimibili), con i file compressi risparmierai il 97% di spazio su disco-

A te l’onore (e l’onere, ovviamente), ora, di pensare a possibili applicazioni per questo semplice “trucchetto”.. 😉


Note

  • Su un sistema Linux si consiglia di non utilizzare questo approccio per effettuare dei backup, in quanto 7-Zip non gestisce correttamente i permessi utente sui file. Per un backup su Linux si può utilizzare il comando di compressione tar con gli opportuni parametri.
  • Il metodo della compressione è fortemente raccomandato, oltre che per quanto riguarda i file su PC, anche per le bottiglie di plastica da gettare, nonché tutti i rifiuti, in generale. Applicando questo piccolo e semplice trucco scoprirete come è semplice risparmiare almeno l’80% sui sacchetti per la raccolta differenziata..
    • Carlo Vendetti on 4 Febbraio 2016 at 10:22

    Rispondi

    Ciao, bellissimo articolo… ma purtroppo non capisco cosa va a comprimere…. cioè mi spiego meglio se io volessi comprimere dei file all’interno di una sola cartella nota come glielo dico?
    Grazie!!

      • deste on 4 Febbraio 2016 at 10:44

      Rispondi

      Ciao Carlo!
      La procedura descritta in questo articolo comprime delle cartelle (delle quali non si conosce ne il nome, ne la quantità) in un determinato percorso, creando un file compresso per ognuna; per capirci meglio: ho una cartella “base”, che a sua volta contiene le cartelle “a”, “b” e “c” (ognuna di queste cartelle può contenere file e/o altre sottocartelle).. Seguendo le indicazioni di questo articolo siamo in grado di avere come risultato dei file compressi “a.7z”, “b.7z”, “c.7z”.
      Se vuoi comprimere una singola cartella della quale conosci già il nome, la cosa è molto più semplice! Con 7-Zip installato lo puoi fare o da interfaccia grafica di Windows o da prompt dei comandi. Nel primo caso fai clic con il pulsante destro del mouse sulla cartella che vuoi comprimere, vai sulla voce “7-Zip” e poi selezioni “Aggiungi a..” o “Aggiungi all’archivio” per aprire la schermata con tutte le opzioni di compressione. Per lanciare il comando tramite un file batch basta che vai nel percorso dove hai la cartella che vuoi comprimere e lanci:
      “C:Program Files7-Zip7z.exe” a “cartella_compressa.7z” “cartella_da_comprimere”
      …Spero di essere stato chiaro 🙂

        • Waldo on 26 Ottobre 2016 at 16:19

        Rispondi

        ciao deste, io ho un’esigenza leggermente diversa: vorrei utilizzare 7-zip per creare una copia compressa del mio backup (se possibile protetta da pwd) su un’altra directory. Esempio:
        la cartella da comprimere è D:backup
        la cartella dove salvare l’archivio dovrebbe essere E:7zbackup
        Cosa deve contenere il mio file batch?

          • deste on 27 Ottobre 2016 at 12:18

          Rispondi

          Ciao Waldo!
          Per fare una cosa di questo tipo il tuo file batch deve contenere:
          “C:Program Files7-Zip7z.exe” a “E:7zbackupbck.7z” “D:backup” -pPASSWORD

          …Per impostare una password all’archivio è sufficiente mettere alla fine il parametro -P e scrivere di seguito (senza spazi di mezzo) la password che vuoi utilizzare.
          Se al posto di un file in formato .7z vuoi un .zip, basta specificare questa estensione al file di destinazione.
          Semplice, no? 🙂

          Tuttavia per questa tua necessità ti consiglio di valutare un tool di backup/sincronizzazione: avresti un migliore controllo rispetto che una soluzione “base” come questa, direttamente tramite uno script con 7Zip.
          Un tool gratuito in versione Standard (licenza freeware) con il quale mi trovo molto bene è SyncBackFree ( http://www.2brightsparks.com/freeware/freeware-hub.html ).

          Buoni salvataggi! 😉

    • 3olo on 15 Febbraio 2017 at 06:28

    Rispondi

    ciao,complimenti per l’articolo,lo uso tantissimo!
    Ho modificato leggermente la batch per comprimere singoli files invece che cartelle. La batch è questa:
    for %%X in (*.stp) do “C:Program Files7-Zip7z.exe” a -tzip “%%X.7z” “%%X”
    Purtroppo però quando vado a selezionare più file compressi con questa batch e a decomprimerli contemporaneamente (selezionandoli tutti,tasto dx, 7z, estrai in ….)me li decomprime ma mi da dei messaggi segnalandomi che i file sono nominati con estensione 7z ma in realtà sono zip. C’è un modo per farli comprimere realmente in formato 7z? Ti ringrazio

      • deste on 15 Febbraio 2017 at 07:47

      Rispondi

      Grazie!
      Per usare la compressione 7z basta non specificare il parametro -t{type} (ovvero il tuo -tzip): in questo modo 7zip comprime usando l’algoritmo corretto in funzione dell’estensione che specifichi per i file di output (.7z). Oppure modifica -tzip in -t7z
      ciao ciao

        • 3olo on 15 Febbraio 2017 at 08:37

        Rispondi

        Ciao! Grande!!! Adesso è perfetta!! Grazie mille ancora, ti saluto

    • giuseppe on 16 Giugno 2020 at 20:51

    Rispondi

    bellissimo, funziona perfettamente, avevo piu di 2000 cartelle sono riuscito a compattarle tutti in un solo colpo , FAVOLOSO

      • deste on 16 Giugno 2020 at 22:27
      • Autore

      Rispondi

      Ottimo Giuseppe! 🙂
      Mi fa davvero piacere che questo piccolo “trucchetto” (datato, ma sempre buono!) ti abbia fatto risparmiare un po’ di tempo.
      Grazie per il tuo riscontro!

    • andrea on 5 Agosto 2020 at 12:19

    Rispondi

    fantastico!!! solo una cosa: dopo la compressione, come faccio a far eliminare con la stessa riga di comando le cartelle originali, quelle NON zippate, per intenderci??
    grazie!!

      • deste on 5 Agosto 2020 at 12:28
      • Autore

      Rispondi

      Ciao Andrea! Grazie tante per il tuo feedback: mi fa piacere che ti sia tornato utile questo vecchio articolo!

      Per eliminare le cartelle originali, dopo che sono state compresse, è sufficiente utilizzare l’opzione “sdel” di 7Zip. All’interno del file .bat con lo script batch, aggiungi dunque alla fine della riga l’opzione -sdel in questo modo:
      for /d %%X in (*) do "C:\Program Files\7-Zip\7z.exe" a "%%X.7z" "%%X\" -sdel

    • andrea on 6 Agosto 2020 at 11:24

    Rispondi

    Grazie, funziona benissimo…
    vorrei chiederti un’ altra cosa, se possibile: lavoro su un pc dove salvo in una cartella svariati file in pdf, avrei bisogno di un “robocopy” incrementale che copiasse questi file in un’ altra cartella, posizionata su un server esterno, il tutto poi lo renderei automatizzato ogni qualvolta salvo un pdf nuovo, questo per renderlo disponibile ai colleghi di un altro ufficio..
    riesci ad aiutarmi??
    un grazie anticipato….

      • deste on 6 Agosto 2020 at 11:42
      • Autore

      Rispondi

      Ottimo! 🙂
      Per rendere disponibili i file di una cartella “X” su un’altra cartella “Y” (che immagino essere accessibile dal tuo PC tramite un percorso di rete o un’unità mappata), se ho ben capito la tua necessità… Ti consiglierei di valutare una soluzione di sincronizzazione di terze parti, anziché mettere in piedi uno script batch o cose simili; questo anche perché per automatizzare il processo non mi viene in mente nulla se non utilizzare l’utilità di pianificazione di Windows ed eseguire l’eventuale script ogni “tot” minuti.. Ma non la vedo come la soluzione migliore.
      Io personalmente, nei tuoi panni, farei qualche prova con il programma open source FreeFileSync; l’ho già utilizzato in passato e devo dire che fa egregiamente il suo lavoro. È altamente configurabile e, anche se l’interfaccia utente a prima vista può sembrare un po’ caotica, una volta che ci si prende confidenza e si imposta il job nel modo corretto quasi te ne puoi dimenticare 😉

    • andrea on 7 Agosto 2020 at 09:08

    Rispondi

    capisco, ma preferirei la prima soluzione, ovvero il batch, perchè su questi pc meglio sarebbe non installare nulla….ti direi che con la pianificazione di Windows dovrei riuscire a risolvere in modo soddisfacente il mio problema…
    grazie

    • Roberto on 1 Settembre 2020 at 11:31

    Rispondi

    Salve,
    avrei una necessità simile per la compressione con .bat, solo che lo ZIP creato contiene anche la cartella di origine, quindi la mia domanda è: come creare il batch in modo che per ogni cartella che contiene diversi file sia creato un file zip con il nome della cartella ma che contenga solo i files e non cartella e files?
    Grazie in anticipo a chi potrà aiutarmi in questo

      • deste on 1 Settembre 2020 at 11:45
      • Autore

      Rispondi

      Ciao Roberto.
      Per ottenere ciò di cui hai bisogno, è sufficiente una piccola modifica all’opzione che specifica la sorgente dei file da comprimere: anziché dare la cartella con "%%X\", si passa a 7z.exe l’elenco dei file contenuti nella cartella, in quanto modo: ".\%%X\*".
      Il comando completo da mettere nel file batch per creare gli zip come vuoi tu, solo con i file e senza la cartella che li contiene, diventa dunque:
      for /d %%X in (*) do "C:\Program Files\7-Zip\7z.exe" a "%%X.zip" ".\%%X\*"

    • Roberto on 1 Settembre 2020 at 11:59

    Rispondi

    Ciao deste,
    Perfetto!!! Gentilissimo (e super rapido nel supporto), ho solo un piccolo dubbio:
    nello ZIP mi trovo anche un file gost “Thumbs.db”, e non so se è possibile evitarlo… Premetto che nel .bat ci sono anche “@eco off” prima della riga di comando e “pause” alla fine (in quanto ho seguito altri suggerimenti precedenti), ma sinceramente non so se sono tali comandi a creare questo file gost.
    Comunque sia ritengo sia a prescindere “il male minore” visto e considerato il numero di file ZIP che dovrei creare
    Grazie in anticipo per eventuali ulteriori “dritte” in merito all’eliminazione di tale file dallo ZIP (presumendo che lo stesso possa creare dubbi in chi come me lavora con i file “gost” visibili nelle directory
    Cordiali Saluti

      • deste on 1 Settembre 2020 at 12:15
      • Autore

      Rispondi

      Tranquillo Roberto! Se posso dare una mano, è sempre un piacere.
      In Windows i file thumbs.db sono file di database che contengono le anteprime delle immagini all’interno di una cartella; sono file nascosti generati automaticamente da Windows e non c’è alcun problema a cancellarli o ad escluderli dai backup. Per escludere un certo filename dal salvataggio di 7-Zip è sufficiente usare il parametro -x (unitamente al parametro -r, se si vuole, per applicare l’opzione ricorsivamente in eventuali sottocartelle). Il comando @echo off che hai inserito nel tuo batch serve soltanto per sopprimere la scrittura a schermo dei comandi contenuti nel file batch (la @ davanti non mostra neppure a schermo “echo off” stesso); pause fa una pausa alla fine dell’esecuzione dello script, in modo da lasciarti aperta la finestra dove il batch è stato eseguito finché non premi, come mostrato, un pulsante per proseguire.

      Il comando da mettere nel tuo batch per escludere i file thumbs.db sarà quindi:
      for /d %%X in (*) do "C:\Program Files\7-Zip\7z.exe" a "%%X.zip" ".\%%X\*" -r -x!thumbs.db

    • Roberto on 1 Settembre 2020 at 12:22

    Rispondi

    IP IP URRA’ !!!
    Grazie 1000 per il pronto riscontro…. funziona esattamente come richiesto.

    “Averecene in giro di gente disponibile ad aiutare come te…. sarebbe certamente un mondo migliore !!! ”

    Saluti e buona giornata

    • Roberto on 1 Settembre 2020 at 12:32

    Rispondi

    Scusa deste,
    ho notato che il .Bat laddove siano presenti più di un folder crea lo ZIP senza cartella nel primo ZIP e non lo fa per le altre…. c’è modo per arginare questo punto?
    Ritengo di si, (scusami ma sto andando per tentativi essendo totalmente ignorante in materia shell)
    in sostanza (per rendere la spiegazione migliore), provo a sintetizzare quanto mi servirebbe:
    Io ho in un folder “X” una serie di Sub-folders “A”, “B”, “C” etc…. (gli stessi contengono ognuno differenti files).
    Il batch, mi dovrebbe creare all’interno di “X” i relativi file ZIP “A.zip”, “B.zip”, “C.zip”, etc… che contengano solo i files all’interno del rispettivo folder (“A”, “B”, “C”, etc…).
    Pensi sia possibile?
    Scusami ancora per le domande continue (prima avevo fatto il test con un solo folder ma quando ho provato con due il secondo file ZIP l’ho trovato con la cartella (cosa che invece vorrei evitare)
    Grazie nuovamente per quanto potrai aiutarmi a capire/fare

      • deste on 1 Settembre 2020 at 13:17
      • Autore

      Rispondi

      Se ho ben capito quello che mi stai dicendo, tu hai una situazione di questo tipo:

      struttura cartelle

      Ovvero una cartella dove hai delle sottocartelle A, B, C.. ecc.
      Il tuo file batch (che io ho chiamato “comprimi.bat”) ce l’hai dove hai anche le cartelle A, B, C.. Giusto?

      Ho ricreato questa precisa situazione; eseguendo nel batch il comando:
      for /d %%X in (*) do "C:\Program Files\7-Zip\7z.exe" a "%%X.zip" ".\%%X\*" -r -x!thumbs.db
      fa esattamente ciò che desideri tu: mi crea i 3 file a.zip, b.zip e c.zip, con all’interno di ognuno di questi, rispettivamente, file1 e file2, file3 e file4, file5 e file6.. Senza cartelle!

      Mi confermi che la struttura delle cartelle e dei file è uguale a quella che hai tu?
      Utilizzi un sistema operativo Windows? La versione di 7-Zip che hai installato?

    • Roberto on 1 Settembre 2020 at 14:45

    Rispondi

    Ti confermo quanto considerato nello sketch, ad eccezione che i file thumbs non sono nelle cartelle, li trovo all’interno del file ZIP.
    la versione di Windows è la 10 Enterprise (Version 1709 – OS Build 16299.2045) a 64bit
    Mi trovo in ambiente di Rete e non sono l’Amministratore del PC in uso (se potesse servire come info)
    La versione di 7-Zip è la 16.04 (64 bit) – 2016-10-04.
    Spero di aver risposto alla tua richiesta correttamente.
    Sto testando il tutto su un HD esterno (ma non credo sia un problema per il bat – almeno credo).
    la cartella X è contenuta in altre cartelle, ma il bat è contenuto come da sketch…
    proprio ora ho verificato una cosa (mi era sorto un dubbio, e la cartella di origine conteneva una sottocratella…. mea-culpa)
    scusami….
    il tutto funziona come giustamente mi hai fatto notare tu – perdona la perdita di tempo causata.
    Saluti

      • deste on 1 Settembre 2020 at 15:01
      • Autore

      Rispondi

      Ottimo Roberto! Ora dunque tutto torna: mi fa piacere! 🙂
      Solo una nota relativamente ai file thumbs.db. Non li vedi nelle cartelle, ma ci sono! Sono file di sistema nascosti; per mostrarli dovresti modificare l’opzione della cartella Windows, che di default giustamente nasconde tali tipi di file.

      Buon proseguimento di giornata e buona vita 🙂

Lascia un commento

Il tuo indirizzo email non verrà pubblicato.