Vorrei trovare i file contenenti string specifica sotto linux. Ho provato qualcosa di simile ma non ci sono riuscito:come trovare i file contenenti una stringa utilizzando egrep
trovare. -name * .txt | egrep mystring
Vorrei trovare i file contenenti string specifica sotto linux. Ho provato qualcosa di simile ma non ci sono riuscito:come trovare i file contenenti una stringa utilizzando egrep
trovare. -name * .txt | egrep mystring
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).
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
Vorrei anche suggerire che racchiude il modello segue - nome tra virgolette per evitare che la shell faccia il pattern matching su di esso –
Vorrei ringraziare tutti voi per aver fornito risposte così esaurienti. – Tolga
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
si potrebbe usare
find . -iname *.txt -exec egrep mystring \{\} \;
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' {} \;
c'è un opzione ricorsiva da egrep è possibile utilizzare
egrep -R "pattern" *.log
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. –
Forse con 'egrep -R" modello "--include = *. Log .'? – moala
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 \;
Manca '\ +' o '\;' alla fine del primo comando. – spatz
Questo tentativo di trovare il nome del file all'interno di mystring? Penso che stia cercando il contrario. – Kevin
@spatz: grazie per l'osservazione, ho corretto l'esempio. –