Puoi anche usare globstar.
Costruire grep
comandi 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 --include
l'opzione . Ma se vuoi usare solo il grep
comando 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 -H
flag fa grep
mostrare il nome del file anche se viene trovato un solo file corrispondente. È possibile passare il -a
, -i
e -n
le bandiere (dal esempio) per grep
pure, se questo è quello che vi serve. Ma non passare -r
o -R
quando 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 bash
spiegato:
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 globstar
Disattiva 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 find
comando. 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.txt
che 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 find
non sono soggetti a questa limitazione, perché:
Il modo in cui Zanna costruisce ed esegue un grep
comando con potenzialmente molti argomenti di percorso. Ma se vengono trovati più file di +
quanti possano essere elencati in un singolo percorso, l' -exec
azione -terminated esegue il comando con alcuni dei percorsi, quindi lo esegue di nuovo con alcuni altri percorsi e così via. Nel caso di grep
ing 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 grep
separatamente per ogni file.txt
trovato. 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, grep
produrre output colorato. Ma si può facilmente ottenere questo con find
, anche .
Gli account utente in Ubuntu sono creati con un alias che fa grep
davvero funzionare grep --color=auto
(corri alias grep
per vedere). È una buona cosa che gli alias siano praticamente espansi solo quando li emetti in modo interattivo , ma significa che se vuoi find
invocare grep
con la --color
bandiera, dovrai scriverlo esplicitamente. Per esempio:
find . -name file.txt -exec grep --color=auto -H 'pattern' {} +