DOS: elencare e filtrare i file contenuti in una cartella con DIR e FINDSTR

Capita spesso di dover estrarre l’elenco dei file contenuti in una determinata directory, possibilmente ordinandoli secondo un dato criterio ed applicando dei filtri che includano nella lista solo i file necessari ed escludano gli altri.
Per fare questo DOS ci mette a disposizione il famoso comando dir che offre alcune opzioni che ci possono aiutare ad estrapolare con precisione quello che vogliamo.

Facciamo un esempio:
In questo caso vogliamo creare un file contenente la lista dei file presenti nella cartella corrente, con i seguenti vincoli:

– Nella lista ci deve essere solo il nome dei file e non il path in cui si trova
– Nell’elenco devono comparire solo i file, di qualsiasi tipo, e non le directory
– La lista dei files deve essere ordinata dal più recente al più vecchio
– Il risultato deve essere salvato in un file chiamato “listaFile.txt”

Immagine1

Il file “listaFile.txt” dovrà avere quindi il seguente contenuto:

Documento1000.docx
Table1.xlsx
AA_Document.docx
TextFile1.txt
Document2.docx
Document1.docx

Iniziamo eseguendo il comando dir senza specificare alcuna opzione:

Immagine2

Dell’esecuzione del comando dir senza opzioni ci sono parecchie cose che dobbiamo sistemare. Per prima cosa dovremmo eliminare tutte le informazioni superflue, come la descrizione del tipo di unità, i dettagli su data ed ora relativi ai files e le informazioni finali di riepilogo.
Per fare questo dobbiamo invocare il comando dir con l’opzione /B che sta per Bare format, ovvero il formato che per l’appunto non include intestazione, dimensione, riepilogo, ecc..

Proviamo quindi ad eseguire il comando: dir /B

Immagine3

Bene, abbiamo rimosso le informazioni aggiuntive che non ci servivano ed abbiamo ora la lista dei files senza il path completo. Notiamo però che nel risultato prodotto dal comando sono elencate anche le directories e non solo i file come ci è stato richiesto. Dobbiamo quindi trovare il modo di indicare al comando dir che vogliamo escluderle.
Anche questa richiesta può essere facilmente soddisfatta tramite le opzioni del comando; in particolare l’opzione /A del comando dir permette di specificare gli Attributi che devono avere i files per essere presi in considerazione.

Questi attributi possono ad esempio essere:
D per le Directories
R per i files Read-only
H per i files nascosti (Hidden)
S per i files di sistema (System)

Gli attributi in combinazione con l’opzione /A permettono di selezionare solo i files che hanno determinate caratteristiche. Ad esempio, con l’opzione /AD si possono elencare solo le directories. Noi però dobbiamo fare esattamente il contrario, quindi non selezionare le voci che hanno un determinato attributo, ma eliminare quelle che lo possiedono, in questo caso l’attributo D che indica che quella voce è una directory. Per farlo dobbiamo anteporre all’attributo il simbolo (meno), ad indicare che vogliamo tutti i file “meno” quelli che hanno un determinato attributo (in questo caso la D di directory).

Eseguiamo quindi il comando: dir /B /A-D

Immagine4

Ok, siamo riusciti nel nostro intento e le directories “Folder 1” e “Folder 2” sono sparite dall’elenco. Siamo vicini alla soluzione della nostra richiesta e ci manca da soddisfare solo l’ultima clausola, quella che ci chiede di elencare i files dal più recente al più vecchio.
La soluzione, ancora una volta, è semplicemente tra le opzioni del comando dir. L’opzione /O, infatti, permette di specificare un criterio di ordinamento per gli elementi elencati in output dal comando.

I possibili criteri di ordinamento sono:
N per Nome (in ordine alfabetico)
S per dimensione (Size) con i più piccoli per primi
E per Extension (in ordine alfabetico)
D per Data (i più vecchi prima)
G per Gruppo (le directories prima)

Anche in questo caso si può utilizzare il meno per invertire l’ordine di default definito dall’opzione. Tornando al nostro esempio, a noi è richiesto di ordinare i files per data, quindi dovremo utilizzare il criterio D. Di default però, l’opzione D mette i files più vecchi in cima alla lista, mentre a noi serve l’ordinamento inverso, con i più recenti all’inizio. Dobbiamo quindi utilizzare il per invertire il comportamento:

Il nostro comando completo diventa quindi: dir /B /A-D /O-D

Immagine5 NEW

I files, come possiamo verificare guardando la figura 1 dell’articolo, sono elencati in ordine di data dal più recente al più vecchio, per cui abbiamo finalmente ottenuto il risultato desiderato.
A questo punto l’unica cosa che ci manca è salvare questa lista su file. Utilizziamo quindi il simbolo di redirezione ‘>‘ per indicare che vogliamo indirizzare l’output del comando sul file “listaFiles.txt”.

Eseguiamo quindi: dir /B /A-D /O-D > listaFiles.txt

Immagine6 NEW

In questo caso, come detto, abbiamo rediretto l’output del comando su file, per cui nella console non vediamo nessun messaggio e ci viene semplicemente riproposto il prompt.

Andiamo quindi a vedere nella nostra cartella e vediamo che è stato creato il file “listaFiles.txt” che conterrà il risultato del comando eseguito e, quindi, la lista dei nostri files.
Immagine7

Apriamo quindi il file ed andiamo a verificare il contenuto:

Immagine10

ALT!
Un momento, c’è qualcosa che non va. Il file contiene si la lista dei file presenti nella cartella ma nell’elenco ha incluso anche se stesso, essendo stato generato all’interno della cartella stessa. Ed inoltre è il primo della lista, essendo il più recente, in quanto creato per ultimo.

Per evitare di avere il file di output incluso nella lista lo creiamo quindi non nella cartella stessa di cui vogliamo elencare il contenuto ma, ad esempio, in una cartella al livello precedente.

Immagine 6 BIS

Andando a verificare nuovamente il contenuto del file listaFiles.txt vediamo che questa volta è corretto:

Documento1000.docx
Table1.xlsx
AA_Document.docx
TextFile1.txt
Document2.docx
Document1.docx

Proviamo adesso ad aggiungere un ulteriore condizione da applicare nella selezione dei files da mostrare:

– Vogliamo elencare solo i file con estensione .docx

In realtà questa condizione non aggiunge grande complessità e possiamo semplicemente soddisfarla utilizzando la wildcard ‘*‘ come segue:

Immagine8 NEW

Come si può vedere abbiamo limitato la ricerca ai soli file .docx

Nel caso in cui volessimo invece filtrare la lista dei file utilizzando più condizioni, ad esempio 2 o più estensioni ma in generale qualsiasi regola sulla naming dei file, possiamo utilizzare il comando findstr in collaborazione con dir. Per farlo utilizziamo l’operatore ‘|‘ (pipe) che indirizza l’output del comando dir come input del comando findstr.

Nell’esempio seguente selezioniamo tutti i file .docx ed i file .xslx

Immagine9 NEW

L’opzione /I del comando findstr sta ad indicare di effettuare il confronto in modalità case insensibile, cioè senza distinzione tra maiuscole e minuscole.

Leave a Reply

Your email address will not be published. Required fields are marked *