Me gustaría enumerar los archivos de forma recursiva y única que contienen la palabra dada.
Ejemplo : Comprobando la palabra «comprobar», lo que normalmente hago es un grep
$ grep check * -R
Pero como hay muchas apariciones de esta palabra, obtengo muchos resultados. Así que solo necesito enumerar los nombres de archivo que contienen la palabra de búsqueda dada. Supongo que algún truco con find
y xargs
sería suficiente aquí, pero no estoy seguro.
¿Alguna idea?
Respuesta
Utilice -l
o --files-with-matches
opción que se documenta de la siguiente manera:
Suprime la salida normal; en su lugar, imprima el nombre de cada archivo de entrada desde el que normalmente se habría impreso la salida. El escaneo se detendrá en el primer partido. (
-l
es especificado por POSIX.)
Entonces, para su ejemplo, puede usar lo siguiente:
$ grep check * -lR
Comentarios
Respuesta
find . -type f -exec grep -l check {} +
Probablemente no quieras usar la opción -R
que con las versiones modernas de GNU grep
sigue enlaces simbólicos cuando desciende de directorios. Utilice la opción -r
en su lugar, que desde la versión 2.12 (abril de 2012) ya no sigue enlaces simbólicos.
Si su grep no es el de GNU, o es anterior a la versión 2.12, o si necesita que su código sea portátil a sistemas GNU que no sean de última generación, use el find
comando anterior.
De lo contrario, puede hacer:
grep -rl check .
No use *
(ya que eso omitiría los archivos ocultos en el directorio actual (y solo en el directorio actual) y causaría problemas a los archivos cuyo nombre comience con -
), evite pasar opciones después de argumentos ya que eso no es guaran Está diseñado para funcionar según el entorno y no es portátil.
Respuesta
Intente esto:
find . -type f | xargs grep -c check $1 | grep -v ":0"
En cuanto a las grep
banderas …
-c
devuelve un nombre de archivo seguido de: y un número que indica cuántas veces aparece la cadena de búsqueda en el archivo dado.
-v
tomará la salida del primer grep
busque, filtre los archivos con resultados cero e imprima solo los archivos con resultados distintos de cero.
Comentarios
- Esto obtendrá un falso negativo si tiene archivo (s) (o director (s)) cuyos nombres contienen
:0
. Es ' mejor hacerlogrep -v ':0$'
. Incluso eso se ahogará con los nombres de ruta que contienen nuevas líneas.
Respuesta
grep -lR "text-to-find" <where-to-find>
también funciona bien.
Por ejemplo, grep -lR "NAVIGATE" .
donde encontramos la palabra NAVIGATE
en el .
en el directorio actual.
Respuesta
grep -rin «whatToFind» locationToFInd
eg $ grep -rin «vihaan».
buscará y enumerará recursivamente los nombres de archivos y las líneas correspondientes que tengan «vihaan» en ellos, «. se refiere al directorio actual.
Responder
find . -type f | grep "keyword" *
buscar en el directorio actual. Para buscar desde la raíz, especifique /
en lugar de .
Respuesta
grep -rli trim \` find . -name *.q \`
Proporcionarle la lista de .q
archivos que contiene la palabra clave trim
grep -rl "text to find" "/usr/share"
y funcionó muy bien.