Puoi anche usare globstar.
Costruire grepcomandi con find, come nella risposta di Zanna , è un modo altamente robusto, versatile e portatile per farlo (vedi anche la risposta di sudodus ). E Muru ha pubblicato un ottimo approccio di utilizzo di grep's --includel'opzione . Ma se vuoi usare solo il grepcomando e la tua shell, c'è un altro modo per farlo: puoi fare in modo che la shell esegua la ricorsione necessaria :
shopt -s globstar # you can skip this if you already have globstar turned on
grep -H 'pattern' **/file.txt
Il -Hflag fa grepmostrare il nome del file anche se viene trovato un solo file corrispondente. È possibile passare il -a, -ie -nle bandiere (dal esempio) per greppure, se questo è quello che vi serve. Ma non passare -ro -Rquando si utilizza questo metodo. È la shell che ricorre alle directory per espandere il modello glob contenente **e nongrep .
Queste istruzioni sono specifiche per la shell Bash. Bash è la shell utente predefinita in Ubuntu (e nella maggior parte degli altri sistemi operativi GNU / Linux), quindi se sei su Ubuntu e non sai quale sia la tua shell, è quasi sicuramente Bash. Sebbene le shell popolari di solito supportino **globi che attraversano directory , non sempre funzionano allo stesso modo. Per ulteriori informazioni, vedere Stéphane Chazelas s' eccellente risposta a Il risultato di ls *, ** ls e ls *** su Unix.SE .
Come funziona
L' attivazione dell'opzione globstar bash shell crea **percorsi di corrispondenza contenenti il separatore di directory ( /). È quindi un glob ricorsivo di directory. In particolare, come man bashspiegato:
Quando l' opzione della shell globstar è abilitata e * viene utilizzato in un contesto di espansione del percorso, due * adiacenti utilizzati come un singolo modello corrisponderanno a tutti i file e zero o più directory e sottodirectory. Se seguito da un /, due * adiacenti corrisponderanno solo alle directory e alle sottodirectory.
Dovresti stare attento con questo, dal momento che puoi eseguire comandi che modificano o eliminano molti più file di quelli che intendi, specialmente se scrivi **quando volevi scrivere *. (È sicuro in questo comando, che non modifica alcun file.) shopt -u globstarDisattiva l'opzione di shell globstar.
Ci sono alcune differenze pratiche tra globstar e find.
findè molto più versatile di globstar. Qualunque cosa tu possa fare con globstar, puoi farlo anche con il findcomando. Mi piace globstar, e talvolta è più conveniente, ma globstar non è un'alternativa generale a find.
Il metodo sopra non appare nelle directory i cui nomi iniziano con a .. A volte non si desidera ricorrere a tali cartelle, ma a volte lo si fa.
Come con un normale globo, la shell crea un elenco di tutti i percorsi corrispondenti e li passa come argomenti al comando ( grep) al posto del globo stesso. Se hai chiamato così tanti file file.txtche il comando risultante sarebbe troppo lungo per l'esecuzione del sistema, allora il metodo sopra fallirà. In pratica avresti bisogno di (almeno) migliaia di tali file, ma potrebbe succedere.
I metodi che utilizzano findnon sono soggetti a questa limitazione, perché:
Il modo in cui Zanna costruisce ed esegue un grepcomando con potenzialmente molti argomenti di percorso. Ma se vengono trovati più file di +quanti possano essere elencati in un singolo percorso, l' -execazione -terminated esegue il comando con alcuni dei percorsi, quindi lo esegue di nuovo con alcuni altri percorsi e così via. Nel caso di greping per una stringa in più file, questo produce il comportamento corretto.
Come il metodo globstar trattato qui, questo stampa tutte le linee corrispondenti, con percorsi anteposti a ciascuna.
la via di sudodus corre grepseparatamente per ogni file.txttrovato. Se ci sono molti file, potrebbe essere più lento di altri metodi, ma funziona.
Tale metodo trova i file e stampa i loro percorsi, seguiti da eventuali linee corrispondenti. Questo è un formato di output diverso dal formato prodotto dal mio metodo, Zanna e Muru .
Ottenere il colore con find
Uno dei vantaggi immediati dell'utilizzo di globstar è, per impostazione predefinita su Ubuntu, grepprodurre output colorato. Ma si può facilmente ottenere questo con find, anche .
Gli account utente in Ubuntu sono creati con un alias che fa grepdavvero funzionare grep --color=auto(corri alias grepper vedere). È una buona cosa che gli alias siano praticamente espansi solo quando li emetti in modo interattivo , ma significa che se vuoi findinvocare grepcon la --colorbandiera, dovrai scriverlo esplicitamente. Per esempio:
find . -name file.txt -exec grep --color=auto -H 'pattern' {} +