2016-04-27 25 views
6

Il comando seguente trova tutte le occorrenze di 'un po' stringa' ricorsivamente ricerca attraverso la directory corrente e tutte le sottodirectoryBash: Piping Trova in Grep

grep -r -n 'some string' . 

Questo comando ricerche in modo ricorsivo attraverso la directory corrente e tutti i sub- directory e restituisce tutti i file del modulo * .axvw

find . -name '*.axvw' 

voglio mettere questi due comandi insieme in modo da ottenere tutte le occorrenze di 'un po' stringa' ricorsivamente ricerca attraverso la directory corrente, ma solo guardando i file che terminano nell 'axvw '.

Quando ho provato a fare funzionare il seguente comando non è stato restituito:

find . -name '*js' | grep -n 'some string' 

Che cosa sto facendo di sbagliato?

+1

vedere le risposte date qui: http://serverfault.com/questions/9822/recursive-text-search-with-grep-and-file-patterns –

+0

Eventuali duplicati di [Come usare il tubo all'interno di -exec in find] (https://stackoverflow.com/questions/21825393/how-to-use-pipe-within-exec-in-find) – koppor

risposta

8

È possibile utilizzare l'opzione -exec in find:

find . -name '*.axvw' -exec grep -n 'some string' {} + 

Oppure utilizzare xargs:

find . -name '*.axvw' -print0 | xargs -0 grep -n 'some string' 
+2

'-exec grep -n 'some string' {} +' renderebbe l'approccio 'find -exec' competitivo con xargs sulle prestazioni, ed è garantito che sia disponibile nelle specifiche POSIX del 2006. –

+0

Grazie, sì buon punto sull'uso di '+' invece di '\;' – anubhava

1

find . -name '*js' -exec grep -n 'some string' {} \;

Dovrebbe funzionare credo.

Modifica: solo per divertimento, si potrebbe anche usare una doppia grep, credo.

find . | grep 'some string' | grep js

+1

No, la "doppia grep" che suggerisci non aiuta - sta trascurando i nomi dei file, non i contenuti, in entrambe le fasi. –