2013-03-08 6 views
110

Lavorando con xenserver, e voglio eseguire un comando su ogni file che si trova in una directory, estrapolando alcune cose dall'output del comando e aggiungendolo in un file.come eseguire l'operazione grep su tutti i file in una directory

Sono chiaro sul comando che desidero utilizzare e su come eseguire il grep out (s) secondo necessità.

Ma quello su cui non sono chiaro è come faccio a eseguire questo comando su ogni file, passando a quello successivo, fino a quando non vengono trovati altri file.

risposta

58

In Linux, io di solito uso questo comando grep ricorsivo per un particolare testo all'interno di una dir

grep -rni "string" * 

dove,

r = recursive cioè, le sottodirectory di ricerca all'interno della directory corrente
n = per stampare i numeri di riga sullo stdout
i = ricerca senza distinzione tra maiuscole

132

grep $PATTERN * sarebbe sufficiente. Di default, grep salta tutte le sottodirectory. Tuttavia, se si desidera eseguire il grep, il caso è grep -r $PATTERN *.

+22

"grep -r $ modello". è sufficiente. Per grep ricorsivo non è necessario specificare tutti i file – Cougar

+1

Come posso includere più estensioni? Per esempio. "\ *. cpp", "\ *. h"? –

+1

@ Tomáš Zato, fornisci tutti i tuoi schemi di file invece di *: 'grep $ PATTERN * .cpp * .h'. Se hai bisogno di regole più specifiche per i file che devono essere grepped, usa il comando 'find' (controlla la risposta di Rob). – umi

21

Utilizzare find. Scherzi a parte, è il modo migliore perché allora si può veramente vedere quali file sta operando su:

find . -name "*.sql" -exec grep -H "slow" {} \; 

nota, il -H è specifica per Mac, mostra il nome del file nei risultati.

+5

Se si decide di utilizzare find, reindirizzare l'output tramite 'xargs' piuttosto che usare' -exec' questo sarà * molto * più veloce, perché '-exec' genera un nuovo processo per ogni grep, e l'overhead diventa significativo con un gran numero di file. Gli avvertimenti standard sugli spazi nei nomi dei file si applicano a 'xargs'. –

+2

Come sarebbe esattamente? Ho sempre dimenticato la sintassi 'xargs'. –

+1

@BrianPeterson sarebbe qualcosa del genere: 'find. -iname "* .sql" -print0 | xargs -0 grep "slow" ' – MediaVince

2

Se si vuole fare più comandi, è possibile utilizzare:

for I in `ls *.sql` 
do 
    grep "foo" $I >> foo.log 
    grep "bar" $I >> bar.log 
done 
Problemi correlati