Me gustaría encontrar los archivos que contienen una cadena específica en Linux. Intenté algo así como pero no pude tener éxito:cómo encontrar archivos que contienen una cadena usando egrep
buscar. -name * .txt | mystring egrep
Me gustaría encontrar los archivos que contienen una cadena específica en Linux. Intenté algo así como pero no pude tener éxito:cómo encontrar archivos que contienen una cadena usando egrep
buscar. -name * .txt | mystring egrep
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).
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
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 –
Me gustaría agradecerles a todos ustedes por brindarme respuestas tan completas. – Tolga
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
usted podría utilizar
find . -iname *.txt -exec egrep mystring \{\} \;
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' {} \;
hay un opción recursiva de egrep puede utilizar
egrep -R "pattern" *.log
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. –
Tal vez con 'egrep -R" patrón "--include = *. Log .'? – moala
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 \;
Te faltan '\ +' o '\;' al final de tu primer comando. – spatz
¿No intenta encontrar el nombre de archivo dentro de mystring? Creo que está buscando al revés. – Kevin
@spatz: gracias por la observación, he reparado el ejemplo. –