También es posible usar Globstar.
La construcción de grep
comandos 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 --include
opción . Pero si desea utilizar sólo el grep
mando 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 -H
marcas de bandera grep
muestran el nombre del archivo, incluso si sólo se encuentra un archivo coincidente. Puede pasar el -a
, -i
y -n
banderas (de su ejemplo) para grep
, así, si eso es lo que necesita. Pero no deje pasar -r
o -R
cuando 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 bash
explica:
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
.
find
Es mucho más versátil que Globstar. Cualquier cosa que puedas hacer con globstar, también puedes hacerlo con el find
comando. 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.txt
que 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 find
no están sujetos a esta restricción, porque:
La manera de Zanna construye y ejecuta un grep
comando 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 -exec
ejecuta el comando con algunas de las rutas, luego lo ejecuta nuevamente con algunas rutas más, y así sucesivamente. En el caso de grep
una 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 grep
por 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, grep
producirá 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 grep
realmente se ejecute grep --color=auto
(ejecutar alias grep
para ver). Es bueno que los alias se expandan prácticamente solo cuando los emite de forma interactiva , pero significa que si desea find
invocar grep
con la --color
bandera, tendrá que escribirla explícitamente. Por ejemplo:
find . -name file.txt -exec grep --color=auto -H 'pattern' {} +