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
, oc
). - Intervalli di elenchi di caratteri
[a-z]
corrispondono a qualsiasi lettera daa
az
. - 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