A menudo busco 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 BASH es a través de tu búsqueda como un rinoceronte :)
Mostraré cómo funciona esto 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 archivos que contienen 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 el nombre del archivo: fila de hit: cadena buscada
Aquí hay una descripción más detallada de los parámetros utilizados:
-r Para cada operando de directorio, lea y procese todos los archivos en ese directorio, de forma recursiva. Siga los enlaces simbólicos en la línea de comando, pero omita los enlaces simbólicos que se encuentran recursivamente. Tenga en cuenta que si no se proporciona ningún operando de archivo, grep busca en el directorio de trabajo. Esto es lo mismo que la opción '--directories = recurse'.
-i Imprime el nombre del archivo para cada partido. Este es el valor predeterminado cuando hay más de un archivo para buscar.
-n Prefije 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 partido. Este es el valor predeterminado cuando hay más de un archivo para buscar.
-o Imprima solo 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 usan los mismos delimitadores que la entrada, y los delimitadores son bytes nulos si también se usa -z (--null-data) (consulte Otras opciones).
find . -type f -fprint /dev/stderr -exec cat {} \; | grep some string