¿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?

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


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

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.


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' .

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.


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)$'`

2
grep -l hello **/*.{h,cc}

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


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" /


1
Esto no muestra solo archivos .h o .cc y es útil para explicar qué opciones usó y por qué.
kon psych
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.