2013-07-02 09:24:45 +0000 2013-07-02 09:24:45 +0000
83
83

Encontrar archivos que contengan una determinada cadena mediante find (1) y grep (1)

find . -type f -print -exec cat {} \; | grep some string

El comando anterior no imprime la ruta del archivo.

Estoy usando: Ubuntu, bash 4.

Respuestas (5)

117
117
117
2013-07-02 12:01:16 +0000

Yo uso

grep "some string" . -R

y funciona más rápido

p.s.

Caso de uso más complejo

grep -HiRE "some string|other string" . #H for file printing, i for case-insensitive, R for recursive search, E for regex

Para leer el parámetro i explicación

grep --help | grep -- -i
98
98
98
2013-07-02 10:02:41 +0000

Esto se debe a que está alimentando a grep con un flujo de texto que casualmente contiene nombres de archivos. Dado que no proporcionaste ningún nombre de archivo como argumento a grep, no se puede esperar que deduzca de qué archivo proviene una línea coincidente. Utilice xargs:

find . -type f -print | xargs grep "some string"

Dado que tiene GNU find/xargs, esta es una forma más segura de que xargs lea los nombres de los archivos:

find . -type f -print0 | xargs -0 grep "some string"

Si sólo quiere los nombres de los archivos que tienen una línea coincidente sin mostrar la línea coincidente:

find . -type f -print0 | xargs -0 grep -l "some string"
14
14
14
2014-09-26 13:24:22 +0000

A menudo busco el código fuente en estructuras de carpetas complejas y me resulta útil usar

cd /your/folder/
grep -rHino "your string"

Con esos parámetros, sin usar find, obtengo la ruta completa del archivo y el número de línea que contiene la cadena especificada.

También es fácil de recordar porque BASHes a través de su búsqueda como un rHino :)

Voy a mostrar cómo funciona con un ejemplo rápido.

Vamos a mostrar el contenido de un archivo usando cat:

jeeves ~ # cat fw.stop
#!/bin/sh
echo "Stopping firewall and allowing everyone..."
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

Y busquemos recursivamente todos los ficheros que contengan la cadena “iptables -P”:

jeeves ~ # grep -rinHo "iptables -P"
fw.stop:9:iptables -P
fw.stop:10:iptables -P
fw.stop:11:iptables -P

Como puede ver en la salida tenemos nombre de fichero:fila de aciertos:cadena buscada

Aquí tiene una descripción más detallada de los parámetros utilizados:

-r Para cada operando de directorio, lee y procesa todos los archivos en ese directorio, recursivamente. Sigue los enlaces simbólicos en la línea de comandos, pero omite los enlaces simbólicos que se encuentran recursivamente. Tenga en cuenta que si no se da ningún operando de archivo, grep busca en el directorio de trabajo. Esto es lo mismo que la opción ‘–directorios=recurse’.

-i Imprime el nombre del archivo para cada coincidencia. Este es el valor por defecto cuando hay más de un archivo que buscar.

-n Prefija cada línea de salida con el número de línea basado en 1 dentro de su archivo de entrada. (-n está especificado por POSIX.)

-H Imprime el nombre del archivo para cada coincidencia. Este es el valor predeterminado cuando hay más de un archivo para buscar.

-o Imprime sólo las partes coincidentes (no vacías) de las líneas coincidentes, con cada parte en una línea de salida separada. Las líneas de salida utilizan los mismos delimitadores que las de entrada, y los delimitadores son bytes nulos si también se utiliza -z (–null-data) (véase Otras opciones).

2
2
2
2015-10-28 19:03:56 +0000

He preferido

| encontrar el archivo |hacer grep al encontrar el archivo | mostrar la ruta completa del archivo

encontrar / -type f -exec grep ‘some string’ {} \; -exec echo {} \;

0
0
0
2018-10-22 16:15:38 +0000

Silver Searcher es una utilidad muy rápida y práctica para buscar archivos y contenidos.

Para resolver su problema el comando Silver Searcher se vería así…

ag 'some string' -l

-l Sólo imprime los nombres de archivos que contienen coincidencias (no imprime las líneas coincidentes)