Tal vez no cumple con los resultados esperados debido al filtro grep. ¿Qué hay de esto:find . -type f -fprint /dev/stderr -exec cat {} \; | grep some string
artistoex
¿Cuál es el objetivo que quieres lograr? En la salida, está obteniendo cadenas asimiladas de los archivos, ¿desea la ruta de esos archivos?
mirkobrankovic
Sí, quiero imprimir la ruta de los archivos que contienen la cadena 'alguna cadena'. La sugerencia @artistoex imprime todas las rutas de archivo.
H.Rabiee
Es posible que simplemente desee utilizar ackpara examinar todos los archivos en el directorio actual, posiblemente filtrando solo en ciertos tipos de archivos.
Jaap Eldering
Respuestas:
87
Eso es porque estás alimentando grepuna secuencia de texto que simplemente contiene nombres de archivos. Como no proporcionó nombres de archivo como argumentos para grep, no se puede esperar que deduzca de qué archivo proviene una línea coincidente. Uso xargs:
find .-type f -print | xargs grep "some string"
Como tiene GNU find / xargs, esta es una forma más segura para que xargs lea los nombres de archivo:
find .-type f -print0 | xargs -0 grep "some string"
Si solo desea los nombres de archivo que tienen una línea coincidente sin mostrar la línea coincidente:
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
ack
para examinar todos los archivos en el directorio actual, posiblemente filtrando solo en ciertos tipos de archivos.Respuestas:
Eso es porque estás alimentando
grep
una secuencia de texto que simplemente contiene nombres de archivos. Como no proporcionó nombres de archivo como argumentos para grep, no se puede esperar que deduzca de qué archivo proviene una línea coincidente. Usoxargs
:Como tiene GNU find / xargs, esta es una forma más segura para que xargs lea los nombres de archivo:
Si solo desea los nombres de archivo que tienen una línea coincidente sin mostrar la línea coincidente:
fuente
sed '...' $(find ... | xargs grep -l ...)
yo suelo
y funciona más rápido
PD
Caso de uso más complejo
Para leer param i explicación
fuente
-n
si quieres números de línea. +1 para respuesta simplificada.A menudo busco código fuente en estructuras de carpetas complejas y me resulta útil usar:
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:
Y busquemos recursivamente todos los archivos que contienen la cadena "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:
fuente
Yo preferí
El | encontrar el archivo | hacer grep ont buscar archivo | muestra la ruta completa del archivo
find / -type f -exec grep 'alguna cadena' {} \; -exec echo {} \;
fuente
Silver Searcher es una utilidad muy rápida y práctica para buscar archivos y contenido.
Para resolver su problema, el comando del buscador plateado se vería así ...
ag 'some string' -l
-l
Solo imprima nombres de archivo que contengan coincidencias (no imprima las líneas coincidentes)fuente