«

»

Giu 15

Cancellare vecchi files per data in Windows

Lavorando sui servers o su macchine di produzione ci imbattiamo spesso nella necessità di dover mantenere entro un certo limite di occupazione disco i files di log che vengono creati sul file system di una macchina da vari servizi o programmi.

In pratica il problema di solito è quello di cancellare i files più vecchi di una certa data (esempio quelli oltre i 3 mes) mantenendo però nello stesso percorso quelli più recenti in modo da avere si uno storico dell’accaduto ma senza doverci preoccupare di riempire il disco con questi dati.

 

Molti si affidano a script vari in powershell o vba per risolvere la problematica, ma in realtà volendo si può fare tutto da riga di comando (e quindi di conseguenza con un semplice file batch .BAT o .CMD).

E visto che a noi piacciono le cose semplici e funzionali vediamo il comando da utilizzare per questa esigenza che è FORFILES e si trova in tutte le più recenti versioni di Windows.

Tornando al nostro esempio l’esigenza era quella di cancellare i files di log più vecchi di 3 mesi (90 giorn)i dal nostro disco, la sintassi da usare quindi sarà :

FORFILES /P “C:\LOGS” /M *.LOG /D -90 /C “CMD /C DEL @PATH”

in pratica richiamiamo il comando FORFILES dal nostro batch schedulato ogni domenica che provvede a cancellare i log che trova nel percorso specificato più vecchi di 3 mesi, la spiegazione delle opzioni che stiamo utilizzando è :

/P percorso da controllare sul disco
/M maschera dei files da considerare (solo quelli con estensione .LOG)
/D data dei files da considerare (-90 sta appunto per data oltre i 3 mesi rispetto all’attuale)
/C comando da eseguire tra virgolette, nel nostro caso è un DEL , @PATH è il percorso completo del file restituito dal comando FORFILES

Quindi con una sola riga di comando riusciamo a risolvere in modo veloce e brillante la nostra esigenza.

; – )

Visto che la cancellazione da riga di comando non passa dal cestino vi consiglio prima di metterla in produzione di testarla modificando il comando DEL con ECHO in questo modo avrete un’anteprima dei files selezionati dal comando FORFILES e potrete essere sicuri che state scegliendo per la successiva cancellazione SOLO i files che vi interessano veramente !

Quindi seguendo sempre il nostro esempio il comando da usare per il controllo preventivo sarà :

FORFILES /P “C:\LOGS” /M *.LOG /D -90 /C “CMD /C ECHO @PATH” | MORE

Il comando FORFILES oltre che per la cancellazione può essere usato anche per qualsiasi altra operazione di selezione sui files a cui poi andrà applicato un altro comando, per maggiori informazioni sulla sintassi del comando FORFILES potete digitare dalla riga di comando (CMD.EXE) :

FORFILES /?

oppure fare riferimento a questi articoli tecnici :

https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/forfiles

https://en.wikipedia.org/wiki/Forfiles

 

6 commenti

Vai al modulo dei commenti

  1. Giovanni

    Funzione molto utile che fin ora non conoscevo. Mi capita moltissime volte di avere cartelle piene di troppe versioni di file su cui lavoro o anche di log stessi. Di sicuro farò un .bat per entrambi i casi per risparmiare tempo. Grazie della guida!

  2. Dave

    Buongiorno,
    Io ricevo questo errore su windows server 2012

    C:\Users\administrator.ORIDOMAIN>FORFILES /P “C:\LOGS” /M *.LOG /D -90 /C “CMD /C DEL @PATH”
    ERROR: Invalid syntax. ‘/C’ option is not allowed more than ‘1’ time(s).
    Type “FORFILES /?” for usage.

    Grazie

    1. mdede

      Il comando funziona SOLO se è inserito all’interno di un file batch (.BAT) o cmd (.CMD) e quindi eseguito lanciando questo file, se lo simula direttamente dal prompt dei comandi va in errore con il messaggio che ci ha segnalato, forse non era troppo chiaro nell’articolo…. ma era scritto nelle prime righe.

      Crei un file batch di prova, esempio PUILISCI.BAT ed inserisca il comando, lo salvi e quindi lo esegua lanciando PULISCI.BAT e vedrà che funzionerà senza errori.

      Saluti.

  3. Fabio

    Ciao, ma se invece devo solo cercare i file più vecchi di una certa data (senza cancellarli) e metterli magari in una lista ?
    Grazie

    1. mdede

      Semplice usando l’esempio sopra di interrogazione dei files basta modificarlo in questo senso (sempre all’interno di un file.BAT da eseguire poi) :

      DEL C:\LOGS\ELENCO.TXT
      FORFILES /P “C:\LOGS” /M *.LOG /D -90 /C “CMD /C ECHO @PATH” >> C:\LOGS\ELENCO.TXT

      In pratica la prima riga cancella il nostro file di testo con l’elenco, mentre la seconda cerca nalla cartella C:\LOGS tutti i files che hanno estensione .LOG più vecchi di 90 giorni e li salva in ELENCO.TXT

      Ovviamente modifichi i percorsi e le selezioni dei files come da sue esigenze………
      Saluti.

  4. Armando

    Se invece si volesse eliminare tutti i file tranne i primi due più recenti?

Rispondi a mdede Annulla risposta

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>