También es posible usar Globstar.
La construcción de grepcomandos con find, al igual que en la respuesta de Zanna , es un versátil, y de manera muy robusta y portátil para hacer esto (véase también la respuesta de sudodus ). Y Muru ha publicado un excelente enfoque de usar grep's --includeopción . Pero si desea utilizar sólo el grepmando y su concha, hay otra manera de hacerlo - usted puede hacer el depósito propiamente realizar la recursividad es necesario :
shopt -s globstar # you can skip this if you already have globstar turned on
grep -H 'pattern' **/file.txt
Las -Hmarcas de bandera grepmuestran el nombre del archivo, incluso si sólo se encuentra un archivo coincidente. Puede pasar el -a, -iy -nbanderas (de su ejemplo) para grep, así, si eso es lo que necesita. Pero no deje pasar -ro -Rcuando se utiliza este método. Es la cáscara que recursivamente directorios en la expansión del patrón global que contiene **, y nogrep .
Estas instrucciones son específicas del shell Bash. Bash es el shell de usuario predeterminado en Ubuntu (y la mayoría de los otros sistemas operativos GNU / Linux), por lo que si está en Ubuntu y no sabe cuál es su shell, es casi seguro que sea Bash. Aunque los shells populares generalmente admiten **globos de desplazamiento de directorio , no siempre funcionan de la misma manera. Para obtener más información, consulte la excelente respuesta de Stéphane Chazelas a El resultado de ls *, ls ** y ls *** en Unix.SE .
Cómo funciona
Encendido de la Globstar golpe opción shell hace **caminos de los partidos que contienen el separador de directorio ( /). Por lo tanto, es un globo recurrente de directorio. Específicamente, como man bashexplica:
Cuando la opción de shell globstar está habilitada y * se usa en un contexto de expansión de nombre de ruta, dos * s adyacentes utilizados como un solo patrón coincidirán con todos los archivos y cero o más directorios y subdirectorios. Si seguido de a /, dos * s adyacentes coincidirán solo con directorios y subdirectorios.
Debes tener cuidado con esto, ya que puedes ejecutar comandos que modifiquen o eliminen muchos más archivos de los que pretendes, especialmente si escribes **cuando querías escribir *. (Es seguro en este comando, que no cambia ningún archivo).shopt -u globstar Desactiva la opción de shell globstar.
Hay algunas diferencias prácticas entre globstar y find .
findEs mucho más versátil que Globstar. Cualquier cosa que puedas hacer con globstar, también puedes hacerlo con el findcomando. Me gusta globstar, y a veces es más conveniente, pero globstar no es una alternativa generalfind .
El método anterior no busca dentro de los directorios cuyos nombres comienzan con a .. A veces no desea repetir estas carpetas, pero a veces sí.
Al igual que con un globo ordinario, el shell construye una lista de todas las rutas coincidentes y las pasa como argumentos a su comando ( grep) en lugar del globo mismo. Si tiene tantos archivos llamados file.txtque el comando resultante sería demasiado largo para que el sistema se ejecute, entonces el método anterior fallará. En la práctica, necesitaría (al menos) miles de esos archivos, pero podría suceder.
Los métodos que utilizan findno están sujetos a esta restricción, porque:
La manera de Zanna construye y ejecuta un grepcomando con potencialmente muchos argumentos de ruta. Pero si se encuentran más archivos de los que se pueden enumerar en una sola ruta, la acción +terminada -execejecuta el comando con algunas de las rutas, luego lo ejecuta nuevamente con algunas rutas más, y así sucesivamente. En el caso de grepuna cadena en varios archivos, esto produce el comportamiento correcto.
Al igual que el método globstar cubierto aquí, imprime todas las líneas coincidentes, con rutas antepuestas a cada una.
el camino de sudodus se ejecuta greppor separado para cadafile.txt encontrado. Si hay muchos archivos, puede ser más lento que otros métodos, pero funciona.
Ese método encuentra archivos e imprime sus rutas, seguido de líneas coincidentes, si las hay. Este es un formato de salida diferente del formato producido por mi método, el de Zanna y el de muru .
Obtener color con find
Uno de los beneficios inmediatos de usar globstar es que, por defecto en Ubuntu, grepproducirá resultados coloreados. Pero se puede conseguir fácilmente con este find, también .
Las cuentas de usuario en Ubuntu se crean con un alias que hace que greprealmente se ejecute grep --color=auto(ejecutar alias greppara ver). Es bueno que los alias se expandan prácticamente solo cuando los emite de forma interactiva , pero significa que si desea findinvocar grepcon la --colorbandera, tendrá que escribirla explícitamente. Por ejemplo:
find . -name file.txt -exec grep --color=auto -H 'pattern' {} +