2009-09-01 2 views

risposta

12

Qui si inviano i nomi dei file (output di find command) come input per egrep; in realtà vuoi eseguire egrep sul contenuto dei file.

Qui ci sono un paio di alternative:

find . -name "*.txt" -exec egrep mystring {} \; 

o meglio ancora

find . -name "*.txt" -print0 | xargs -0 egrep mystring 

Controllare la find command help per controllare ciò che i singoli argomenti fanno.
Il primo approccio genererà un nuovo processo per ogni file, mentre il secondo passerà più di un file come argomento per egrep; i flag -print0 e -0 sono necessari per gestire nomi di file potenzialmente sgradevoli (permettendo di separare correttamente i nomi dei file anche se un nome di file contiene uno spazio, per esempio).

+0

Manca '\ +' o '\;' alla fine del primo comando. – spatz

+0

Questo tentativo di trovare il nome del file all'interno di mystring? Penso che stia cercando il contrario. – Kevin

+0

@spatz: grazie per l'osservazione, ho corretto l'esempio. –

2

prova:

find . -name '*.txt' | xargs egrep mystring 

Ci sono due problemi con la versione:

In primo luogo, *.txt verranno dapprima ampliato dalla shell, dandovi un elenco dei file nella directory corrente che fine a .txt, così per esempio, se avete la seguente:

[[email protected]:~]$ ls *.txt 
test.txt 
[[email protected]:~]$ 

il comando find diventerà find . -name test.txt. Basta provare quanto segue per illustrare:

[[email protected]:~]$ echo find . -name *.txt 
find . -name test.txt 
[[email protected]:~]$ 

In secondo luogo, egrep non prende i nomi dei file da STDIN. Per convertirli in argomenti è necessario utilizzare xargs

+0

Vorrei anche suggerire che racchiude il modello segue - nome tra virgolette per evitare che la shell faccia il pattern matching su di esso –

+0

Vorrei ringraziare tutti voi per aver fornito risposte così esaurienti. – Tolga

1
find . -name *.txt | egrep mystring 

che non funziona come egrep saranno alla ricerca per mystring entro l'output generato da find . -name *.txt che sono solo il percorso *.txt file.

Invece, è possibile utilizzare xargs:

find . -name *.txt | xargs egrep mystring 
1

si potrebbe usare

find . -iname *.txt -exec egrep mystring \{\} \; 
1

Ecco un esempio che restituirà i percorsi dei file di tutti i *.log i file che hanno una riga che inizia con ERROR :

find . -name "*.log" -exec egrep -l '^ERROR' {} \; 
1

c'è un opzione ricorsiva da egrep è possibile utilizzare

egrep -R "pattern" *.log 
+0

Questo non funziona. L'opzione -R ricorre solo nelle directory se vengono fornite nell'elenco degli argomenti. Nel qual caso tutti i file in quelle directory verranno letti non solo i file che terminano in .log. Se hai successo con questo metodo è perché ci sono file che terminano in .log nella directory corrente perché la shell analizza il file * .log. –

+0

Forse con 'egrep -R" modello "--include = *. Log .'? – moala

1

Se desideri solo i nomi dei file:

find . -type f -name '*.txt' -exec egrep -l pattern {} \; 

Se volete i nomi dei file e gli incontri:

find . -type f -name '*.txt' -exec egrep pattern {} /dev/null \;