¿Cómo uso grep para buscar en el directorio actual todos los archivos que tengan la cadena "hola" y que solo muestren archivos .h y .cc?

138

¿Cómo uso grep para buscar en el directorio actual todos y cada uno de los archivos que contienen la cadena "hola" y mostrar solo archivos .h y .cc?

desbordamiento de pila
fuente

Respuestas:

161
grep -r --include=*.{cc,h} "hello" .

Esto dice: busque de forma recursiva (en todos los subdirectorios también) todos los archivos .cc OR .h que contengan "hola" en este .directorio (actual)

De otra pregunta de stackoverflow

desbordamiento de pila
fuente
55
En la publicación original dijiste "directorio actual" y nada sobre necesitarlo recursivamente o en subdirectorios (me doy cuenta de que lo mencionaste en una publicación posterior). Para aquellos interesados ​​en cómo hacerlo solo en el directorio actual, es grep -si "hello" --include=*.{cc,h} ./* ./.*(también busca archivos ocultos). Aquí hay una versión genérica para buscar una cadena en todos los archivos ocultos /: grep -s "hello" * .*. Tal vez lo más útil en general (y lo más simple), esto busca "hola" en todos los archivos no ocultos: grep -si "hello" ./* Gracias a esta publicación: askubuntu.com/a/777456
jbobbins
1
grep -r --include=*.{java,py} "hello" .
Por alguna razón, esto no funciona en macOS, incluso cuando se utiliza la utilidad grep de GNU.
xApple
49

Puede pasar comodines en lugar de especificar nombres de archivo o usar stdin.

grep hello *.h *.cc
Donald Miner
fuente
Necesito todos los subdirectorios también
Stackoverflow
Agregar -Rno funciona desafortunadamente. Expande el *antes de ir recursivamente.
Donald Miner
La respuesta de Noufal es lo que está buscando si necesita subdirectorios
Donald Miner
8
@Jammin Debe ser claro al hacer la pregunta. Esta respuesta es la respuesta "correcta" a su pregunta planteada.
jordanm
$ grep -R hello *# buscar de toda la palabra contiene hola (incluido el subdirectorio)
19

find . -name \*.cc -print0 -or -name \*.h -print0 | xargs -0 grep "hello".

Compruebe las páginas de manual de findy xargspara obtener más detalles.

Noufal Ibrahim
fuente
1
Debe tener un -print0después, '*.cc'ya que de lo contrario no tiene una acción para esa parte de la búsqueda. O usted tiene que insertar paréntesis ahí: find . \( -name '*.cc' -or -name '*.h' \) -print0.
Jonathan Leffler
Gracias por notar eso. He editado la respuesta para "arreglarlo".
Noufal Ibrahim
3
También puede usar la find -exec +sintaxis en lugar de
xargs
@jordanm: Sí: -exec grep "hello" {} +donde el par de llaves representa los nombres de archivo. Buena sugerencia.
Jonathan Leffler
10

Para buscar en el directorio actual de forma recursiva:

grep -r 'myString' .
AB Abhi
fuente
5

Si necesita una búsqueda recursiva, tiene una variedad de opciones. Deberías considerarack .

De lo contrario, si tiene GNU findy xargs:

find . -name '*.cc' -print0 -o -name '*.h' -print0 | xargs -0 grep hello /dev/null

El uso de /dev/nullgarantiza que se impriman los nombres de los archivos; el -print0y-0 ofertas con nombres de archivo que contienen espacios (saltos de línea, etc.).

Si no tiene nombres molestos (con espacios, etc.), puede usar:

find . -name '*.*[ch]' -print | xargs grep hello /dev/null

Esto podría recoger algunos nombres que no pretendía, porque la coincidencia de patrones es más difusa (pero más simple), pero de lo contrario funciona. Y funciona con versiones no GNU de findy xargs.

Jonathan Leffler
fuente
tenga en cuenta que también puede decirfind ... -exec grep "hello" {} +
fedorqui 'SO deja de dañar'
5

Si leo su pregunta detenidamente, me pide "grep para buscar en el directorio actual todos y cada uno de los archivos contienen la cadena" hola "y mostrar solo archivos .h y .cc". Así que para cumplir con sus requisitos precisos aquí está mi presentación:

Esto muestra los nombres de archivo:

grep -lR hello * | egrep '(cc|h)$'

... y esto muestra los nombres y el contenido del archivo:

grep hello `grep -lR hello * | egrep '(cc|h)$'`
Jack
fuente
2
grep -l hello **/*.{h,cc}

Es posible que desee shopt -s nullglobevitar mensajes de error si no hay archivos .h o no .cc.

Glenn Jackman
fuente
44
Sé cómo usar google, etc. Lo pregunté aquí porque varias respuestas tienen "-l" y es bueno tener toda la información en un solo lugar.
Andrew Swift
-l ("el" en minúsculas) Suprime la salida normal. Imprime el nombre de cada archivo de entrada desde el que normalmente se habría impreso la salida. El escaneo / búsqueda se detendrá en la primera coincidencia.
Rex CoolCode Charles
-1

La forma más simple: grep -Ril "Tu texto" /

usuario1733951
fuente
1
Esto no muestra solo archivos .h o .cc y es útil para explicar qué opciones usó y por qué.
kon psych