2009-09-01 12 views

Respuesta

12

Aquí está enviando los nombres de archivo (salida del find command) como entrada a egrep; de hecho, desea ejecutar egrep en el contenido de los archivos.

Aquí hay un par de alternativas:

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

o incluso mejor

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

Comprobar la find command help para comprobar cuáles son los argumentos individuales hacen.
El primer enfoque generará un nuevo proceso para cada archivo, mientras que el segundo pasará más de un archivo como argumento para egrep; los indicadores -print0 y -0 son necesarios para tratar nombres de archivos potencialmente desagradables (lo que permite separar los nombres de los archivos correctamente, incluso si el nombre de un archivo contiene un espacio, por ejemplo).

+0

Te faltan '\ +' o '\;' al final de tu primer comando. – spatz

+0

¿No intenta encontrar el nombre de archivo dentro de mystring? Creo que está buscando al revés. – Kevin

+0

@spatz: gracias por la observación, he reparado el ejemplo. –

2

intento:

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

Hay dos problemas con su versión:

En primer lugar, *.txt En primer lugar se expandieron por el shell, que le da una lista de los archivos en el directorio actual que termina en .txt, por ejemplo, si tiene lo siguiente:

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

su comando find se convertirá en find . -name test.txt. Solo trata de lo siguiente para ilustrar:

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

En segundo lugar, egrep no tiene en nombres de archivo de STDIN. Para convertirlos a argumentos necesita usar xargs

+0

También sugeriría que encierra el siguiente patrón - citar entre comillas para evitar que el intérprete haga coincidencias de patrones en él –

+0

Me gustaría agradecerles a todos ustedes por brindarme respuestas tan completas. – Tolga

1
find . -name *.txt | egrep mystring 

que no funciona como egrep será la búsqueda de mystring dentro de la salida generada por find . -name *.txt que son sólo la ruta a *.txt archivos.

su lugar, puede utilizar xargs:

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

usted podría utilizar

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

He aquí un ejemplo que devolverá las rutas de archivo de un todo *.log archivos que tienen una línea que comienza con ERROR :

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

hay un opción recursiva de egrep puede utilizar

egrep -R "pattern" *.log 
+0

Esto no funciona. La opción -R recurre a los directorios si se incluyen en la lista de argumentos. En ese caso, todos los archivos en esos directorios se leerán no solo archivos que terminen en .log. Si tiene algún éxito con este método es porque hay archivos que terminan en .log en el directorio actual porque el intérprete de comandos analiza el * .log. –

+0

Tal vez con 'egrep -R" patrón "--include = *. Log .'? – moala

1

Si sólo desea que los nombres de archivo:

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

Si desea nombres de archivo y los partidos

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