Cerca dal Prompt dei Comandi di Windows

Il Comando FIND

Per cercare del testo in più file dal prompt dei comandi di Windows o da file batch, puoi utilizzare il comando FIND, presente sin dai tempi di MS DOS e ancora disponibile in Windows 11. È simile al comando Unix grep, ma non supporta espressioni regolari. Se vuoi cercare la parola borogoves nella directory corrente, segui questa sintassi:

find "borogoves" *

Nota che le doppie virgolette attorno al pattern sono obbligatorie. Se stai utilizzando PowerShell, dovrai includere anche le virgolette singole:

find '"borogoves"' *

Invece dell’asterisco (*), puoi specificare una maschera di file come *.htm?. Il comando find mostra i nomi dei file che scannerizza, anche se non trova alcun match all’interno di questi file:

La ricerca è sensibile alle maiuscole per impostazione predefinita, quindi di solito è necessario aggiungere lo switch /I per trattare le lettere maiuscole e minuscole come equivalenti:

find /I "<a href=" *.htm

Se non specifichi il file da cercare, find aspetterà l’input di testo da stdin, in modo da poter instradare l’output di un altro comando. Ad esempio, puoi elencare tutti i comandi di copia supportati in Windows:

help | find /i "copy"

Un altro switch, /V, ti permette di trovare tutte le righe che non contengono il pattern, simile al comando grep -v.

Nei file batch, puoi sfruttare il fatto che il comando find imposta il codice di uscita (errorlevel) a 1 se il pattern non viene trovato. Ad esempio, puoi verificare se la macchina sta eseguendo una versione a 64 bit o a 32 bit di Windows:

@echo off 
rem Based on KB556009 with some corrections reg Query "HKLM\Hardware\Description\System\CentralProcessor\0" /v "Identifier" | find /i "x86 Family" > nul if errorlevel 1 goto win64 
echo 32-bit Windows goto :eof 
:win64 rem Could be AMD64 or ARM64 echo 64-bit Windows

Il Comando FINDSTR: Ricerca con Espressioni Regolari

Se hai bisogno di cercare un’espressione regolare, prova il comando FINDSTR, introdotto in Windows XP. Per ragioni storiche, findstr supporta un sottoinsieme limitato di espressioni regolari, quindi puoi utilizzare solo queste funzionalità regex:

  • Il punto . corrisponde a qualsiasi carattere tranne newline e caratteri ASCII estesi.
  • Elenchi di caratteri [abc] corrispondono a uno qualsiasi dei caratteri specificati (a, b, o c).
  • Intervalli di elenchi di caratteri [a-z] corrispondono a qualsiasi lettera da a a z.
  • L’asterisco (*) indica che il carattere precedente può essere ripetuto zero o più volte.
  • I simboli \< e \> marcano l’inizio e la fine di una parola.
  • Il caret (^) e il simbolo del dollaro ($) indicano l’inizio e la fine di una riga.
  • La barra rovescia (\) evita che qualsiasi carattere speciale venga interpretato in modo speciale, permettendoti di trovare caratteri letterali. Ad esempio, \$ trova il simbolo del dollaro stesso.

Findstr non supporta classi di caratteri (\d), alternanza (|), o altre ripetizioni (+ o {5}).

La sintassi di base è la stessa del comando FIND:

findstr "\<20[0-9][0-9]\>" *.htm

Questo comando trova tutti gli anni che iniziano con 2000 nei file .htm del directory corrente. Proprio come con find, usa lo switch /I per una ricerca case-insensitiva:

Limitazioni e stranezze di FINDSTR

Le liste di caratteri [a-z] sono sempre case-insensitive, quindi echo ABC | findstr "[a-z]" corrisponde.

Il carattere spazio funziona come meta-carattere di alternanza in findstr, quindi una query di ricerca come findstr "new shoes" * troverà tutte le linee contenenti sia new che shoes. Sfortunatamente, non c’è modo di scappare lo spazio e usarlo come carattere letterale in una espressione regolare. Ad esempio, non è possibile trovare linee che iniziano con uno spazio.

Errori di sintassi nelle espressioni regolari vengono ignorati. Ad esempio, findstr "[" * coinciderà con tutte le linee che contengono il carattere [.

Se il file contiene interruzioni di riga Unix (LF), il meta-carattere $ non funziona correttamente. Se l’ultima linea di un file manca di un terminatore di riga, findstr sarà incapace di trovarla. Ad esempio, findstr "</html>$" * non funzionerà se non c’è CR+LF dopo </html>.

Le versioni iniziali di Windows avevano limitazioni sulla lunghezza della riga per find e findstr, così come per altri comandi. Le versioni più recenti hanno eliminato questi limiti, quindi non devi più preoccupartene. Consulta questa domanda su StackOverflow per le limitazioni e i bug di findstr, specialmente nelle prime versioni di Windows.

Il comando findstr opera nel piano di codice OEM (MS DOS); il metacarattere punto non corrisponde a nessuno dei caratteri ASCII estesi. Di conseguenza, il comando non è molto utile per testi non in inglese. Inoltre, non è possibile cercare caratteri Unicode (UTF-8 o UTF-16).

Conclusione

Puoi imparare altri switch digitando findstr /? o find /?. Ad esempio, gli switch aggiuntivi ti consentono di cercare nei sottodirectory o di stampare i numeri di linea. Puoi anche fare riferimento a la documentazione ufficiale.

In generale, i comandi find e findstr sono datati e presentano vari difetti e limitazioni.

Source:
https://dzone.com/articles/search-from-the-windows-command-prompt