Estoy tratando de encontrar una manera de escanear todo mi sistema Linux para todos los archivos que contienen una cadena de texto específica. Solo para aclarar, estoy buscando texto dentro del archivo, no en el nombre del archivo.
Cuando estaba buscando cómo hacer esto, me encontré con esta solución dos veces:
find / -type f -exec grep -H 'text-to-find-here' {} \;
Sin embargo, no funciona. Parece mostrar todos los archivos del sistema.
¿Está esto cerca de la forma correcta de hacerlo? Si no, ¿cómo debería? Esta capacidad de encontrar cadenas de texto en archivos sería extraordinariamente útil para algunos proyectos de programación que estoy haciendo.
.
como un comodín de un solo carácter, entre otros. Mi consejo es usar siempre fgrep o egrep.-H
con-l
(y tal vezgrep
confgrep
). Para excluir archivos con ciertos patrones de nombres que usaríafind
de una manera más avanzada. Sin embargo, vale la pena aprender a usarfind
. Justoman find
.find … -exec <cmd> +
es más fácil de escribir y más rápido quefind … -exec <cmd> \;
. Funciona solo si<cmd>
acepta cualquier número de argumentos de nombre de archivo. El ahorro en el tiempo de ejecución es especialmente grande si<cmd>
se inicia lentamente, como los scripts de Python o Ruby.grep "pattern" path/*.txt
Respuestas:
Haz lo siguiente:
-r
o-R
es recursivo,-n
es el número de línea y-w
significa coincidir con toda la palabra.-l
(L minúscula) se puede agregar solo para dar el nombre de archivo de los archivos coincidentes.Junto con estos,
--exclude
,--include
,--exclude-dir
banderas podrían ser utilizados para una búsqueda eficiente:Esto solo buscará en aquellos archivos que tengan extensiones .c o .h:
Esto excluirá la búsqueda de todos los archivos que terminen con la extensión .o:
Para directorios es posible excluir un directorio (s) particular a través del
--exclude-dir
parámetro. Por ejemplo, esto excluirá los directorios dir1 /, dir2 / y todos coincidirán con * .dst /:Esto funciona muy bien para mí, lograr casi el mismo propósito que el tuyo.
Para más opciones consultar
man grep
.fuente
r
opción es perezosa (atraviesa primero la profundidad, que se detiene después del primer directorio), mientras queR
es codiciosa (atravesará todo el árbol correctamente).R
enr
atravesará los directorios correctamente, peroR
seguirá enlaces simbólicos.Puedes usar
grep -ilR
:i
significa caso de ignorar (opcional en su caso).R
significa recursivo.l
significa "mostrar el nombre del archivo, no el resultado en sí"./
significa comenzar desde la raíz de su máquina.fuente
-i
esto hace que se ralentice mucho, así que no lo use si no es necesario. Pruébelo en un determinado directorio y luego generalice. Debe completarse en pocos minutos. Creo que una expresión regular lo haría más lento. Pero mis comentarios se basan en suposiciones, le sugiero que lo pruebetime
al frente de la línea./*
significa eso. De todos modos, acabo de probarlo y noté que simplemente/
funciona.fgrep is the same as grep -F -> Interpret PATTERN as a list of fixed strings
.grep -Ril "text-to-find-here" ~/sites/
o uso. para el directorio actualgrep -Ril "text-to-find-here" .
Puedes usar ack . Es como grep para el código fuente. Puede escanear todo su sistema de archivos con él.
Solo haz:
En tu directorio raíz.
También puede usar expresiones regulares , especificar el tipo de archivo, etc.
ACTUALIZAR
Acabo de descubrir The Silver Searcher , que es como un ack pero 3-5 veces más rápido que él e incluso ignora los patrones de un
.gitignore
archivo.fuente
Puedes usar:
El
r
representa recursiva y por lo buscará en la ruta especificada y sus subdirectorios. Esto le dirá el nombre del archivo, así como imprimirá la línea en el archivo donde aparece la cadena.O un comando similar al que está intentando (ejemplo:) para buscar en todos los archivos javascript (* .js):
Esto imprimirá las líneas en los archivos donde aparece el texto, pero no imprime el nombre del archivo.
Además de este comando, también podemos escribir esto: grep -rn "Cadena para buscar" / ruta / a / directorio / o / archivo -r: búsqueda recursiva n: se mostrará el número de línea para las coincidencias
fuente
Puedes usar esto:
fuente
Lista de nombres de archivo que contienen un texto dado
En primer lugar, creo que has usado en
-H
lugar de-l
. También puede intentar agregar el texto entre comillas seguido de{} \
.Ejemplo
Supongamos que está buscando archivos que contengan el texto específico "Licencia de Apache" dentro de su directorio. Mostrará resultados algo similares a los siguientes (la salida será diferente según el contenido de su directorio).
Eliminar mayúsculas y minúsculas
Incluso si no utiliza el caso como "texto" frente a "TEXTO", puede usar el
-i
interruptor para ignorar el caso. Puedes leer más detalles aquí .Espero que esto te ayude.
fuente
find
pasará todas las rutas que encuentre al comandogrep -l "text-to-find-here" <file found>"
. Puede añadir restricciones al nombre del archivo, por ejemplo,find / -iname "*.txt"
para buscar sólo en los archivos que finaliza en nombre.txt
-iname
no distingue entre mayúsculas y minúsculas, lo que significa que también encontraría archivos .TXT, por ejemplo, así como TxT y TXt, etc.grep
( GNU o BSD )Puede usar la
grep
herramienta para buscar recursivamente la carpeta actual, como:Nota:
-r
- Recursivamente busca subdirectorios.También puede usar la sintaxis global para buscar dentro de archivos específicos como:
Nota: Al usar la opción global (
**
), escanea todos los archivos de forma recursiva con una extensión o patrón específico. Para habilitar esta sintaxis, ejecute:shopt -s globstar
. También puede usarlo**/*.*
para todos los archivos (excepto los ocultos y sin extensión) o cualquier otro patrón.Si tiene el error de que su argumento es demasiado largo, considere reducir su búsqueda, o use una
find
sintaxis en su lugar como:Alternativamente uso
ripgrep
.ripgrep
Si está trabajando en proyectos más grandes o archivos grandes, debe usarlos
ripgrep
, como:Consulte los documentos, los pasos de instalación o el código fuente en la página del proyecto GitHub .
Es mucho más rápido que cualquier otra herramienta como GNU / BSD
grep
,ucg
,ag
,sift
,ack
,pt
o similares, ya que se construye en la parte superior del motor de expresiones regulares de Rust que utiliza autómatas finitos, SIMD y optimizaciones literales agresivas para que la búsqueda sea muy rápido.Admite ignorar patrones especificados en
.gitignore
archivos, por lo que una sola ruta de archivo se puede comparar con múltiples patrones globales simultáneamente.Puede usar los parámetros comunes como:
-i
- Búsqueda insensible.-I
- Ignorar los archivos binarios.-w
- Buscar las palabras completas (en oposición a la coincidencia parcial de palabras).-n
- Muestra la línea de tu partido.-C
/--context
(por ejemplo-C5
. ): aumenta el contexto para que vea el código circundante.--color=auto
- Marcar el texto correspondiente.-H
- Muestra el nombre del archivo donde se encuentra el texto.-c
- Muestra el recuento de líneas coincidentes. Se puede combinar con-H
.fuente
Si
grep
no admite la búsqueda recursiva, puede combinarlafind
conxargs
:Esto me resulta más fácil de recordar que el formato
find -exec
.Esto generará el nombre del archivo y el contenido de la línea coincidente, p. Ej.
Indicadores opcionales que puede agregar a
grep
:-i
- búsqueda sin distinción entre mayúsculas y minúsculas-l
- solo muestra el nombre del archivo donde se encontró la coincidencia-h
- solo muestra la línea que coincide (no el nombre del archivo)fuente
grep 'text-to-find-here'
sin nombre de archivo sifind
no encuentra nada. ¡Esto se bloqueará y esperará la entrada del usuario! Agregar--no-run-if-empty
como una opción paraxargs
.find … -exec grep … +
. Si insiste en usar find junto con xargs, use-print0
y-0
.i
: Ignora las distinciones entre mayúsculas y minúsculas tanto en el PATRÓN como en los archivos de entrada.n
: Prefije cada línea de salida con el número de línea basado en 1 dentro de su archivo de entrada.s
: Suprime mensajes de error sobre archivos inexistentes o ilegibles.r
: Lea todos los archivos de cada directorio de forma recursiva.fuente
Hay una nueva utilidad llamada The Silversearcher
Funciona estrechamente con Git y otros VCS. Por lo tanto, no obtendrá nada en un .git u otro directorio.
Simplemente puedes usar
¡Y hará la tarea por ti!
fuente
Si usa find like en su ejemplo, agregue mejor
-s
(--no-messages
) agrep
, y2>/dev/null
al final del comando para evitar muchos mensajes de Permiso denegado emitidos porgrep
yfind
:find es la herramienta estándar para buscar archivos, combinada con grep cuando se busca texto específico, en plataformas tipo Unix. Elcomando find a menudo se combina con xargs , por cierto.
Existen herramientas más rápidas y fáciles para el mismo propósito: ver más abajo. Mejor pruébelos, siempre que estén disponibles en su plataforma , por supuesto:
Alternativas más rápidas y fáciles
RipGrep : la herramienta de búsqueda más rápida en torno a:
El buscador de plata :
ack :
Nota: También puede agregar
2>/dev/null
a estos comandos para ocultar muchos mensajes de error.Advertencia : a menos que realmente no pueda evitarlo, ¡no busque desde '/' (el directorio raíz) para evitar una búsqueda larga e ineficiente! Por lo tanto, en los ejemplos anteriores, será mejor que reemplace ' / ' por un nombre de subdirectorio, por ejemplo, "/ home", dependiendo de dónde realmente desea buscar ...
fuente
grep
find
, no busca directamente el texto en el interior de los archivos. Y tal vez esas herramientas adicionales son útiles para algunos, pero los veteranos y aquellos que están acostumbrados, por ejemplogrep
, no les darían ningún tiempo (bueno, ciertamente no lo haré). Sin embargo, no digo que sean inútiles.fol
? No claro que no; fue llamadodir
(y creo que todavía lo es). La carpeta es una cosa ideada para (supongo) facilidad de uso, aunque en este caso tal vez sea tonta para usuarios menos 'avanzados'.Tratar:
fuente
xargs
esa manera ... considere esto.echo "file bar.txt has bar" > bar.txt; echo "file foo bar.txt has foo bar" > "foo bar.txt"; echo "You should never see this foo" > foo; find . -name "*.txt" | xargs grep -i foo # ./foo:You should never see this foo
. Elxargs
aquí coincide con el archivo INCORRECTO y NO coincide con el archivo deseado. O usa unfind .. -print0 | xargs -0 ...
pero ese es un uso inútil de una tubería o mejorfind ... -exec grep ... {} +
Use
pwd
para buscar desde cualquier directorio en el que se encuentre, recurriendo hacia abajoActualización Dependiendo de la versión de grep que esté utilizando, puede omitir
pwd
. En las versiones más recientes.
parece ser el caso predeterminado para grep si no se proporciona un directorio así:grep -rnw -e "pattern"
o
grep -rnw "pattern"
Hará lo mismo que arriba!
fuente
pwd
no es necesario en absoluto, ya que es el predeterminado.grep -rnw "pattern"
es suficientegrep -rnw
y similar es como fue respondido hace tres años, no veo cómo esta respuesta está agregando valor.grep -rnw '/path/to/somewhere/' -e "pattern"
cuál es lo que tienes aquí. 5 votos después de 2.3 millones de visitas no significa mucho.grep
se puede usar incluso si no estamos buscando una cadena.Simplemente corriendo,
imprimirá la ruta a todos los archivos de texto, es decir, aquellos que contengan solo caracteres imprimibles.
fuente
ls
ofind
(para el recursivo)Aquí están las varias listas de comandos que pueden usarse para buscar archivos.
fuente
egrep
es equivalentegrep -E
y significa--extended-regexp
que puede encontrar detalles aquí unix.stackexchange.com/a/17951/196072Silver Searcher es una herramienta excelente, pero ripgrep puede ser aún mejor.
Funciona en Linux, Mac y Windows, y fue escrito en Hacker News hace un par de meses (esto tiene un enlace al Blog de Andrew Gallant que tiene un enlace de GitHub):
Ripgrep: una nueva herramienta de búsqueda de línea de comando
fuente
Explicación de comentarios
find es un comando que le permite encontrar archivos y otros objetos como directorios y enlaces en subdirectorios de una ruta determinada. Si no especifica una máscara que los nombres de archivo deben cumplir, enumera todos los objetos de directorio.
fuente
Tratar:
que buscará en todos los sistemas de archivos, porque
/
es la carpeta raíz.Para el uso de la carpeta de inicio:
Para uso de carpeta actual:
fuente
Espero que esto sea de ayuda ...
Expandir
grep
un poco para dar más información en la salida, por ejemplo, para obtener el número de línea en el archivo donde está el texto, se puede hacer de la siguiente manera:Y si tiene una idea del tipo de archivo, puede reducir su búsqueda especificando extensiones de tipo de archivo para buscar, en este caso archivos
.pas
OR.dfm
:Breve explicación de las opciones:
.
en elfind
especifica del directorio actual.-name
"*.*
": Para todos los archivos (-name "*.pas
" -o -name "*.dfm
"): Sólo los*.pas
OR*.dfm
archivos o especificado con-o
-type f
especifica que está buscando archivos-print0
y--null
en el otro lado de la|
(tubería) están los cruciales, pasando el nombre del archivo defind
algrep
incrustado en elxargs
, permitiendo el paso de nombres de archivo CON espacios en los nombres de archivo, permitiendo que grep trate la ruta y el nombre de archivo como una sola cadena, y no dividirlo en cada espacio.fuente
-name '*.*'
no es lo que dices no se recogería en un archivo llamado 'archivo' porque el patrón no equivale a eso (no .ext);*
sin embargo (bueno. archivos a un lado). Pero hay otra cosa: si quiere todos los archivos, ¿por qué molestarse en especificar un nombre de archivo en primer lugar? Ningún otro comentario, excepto que es bueno saber que todavía hay personas que no usan la 'carpeta' de terminología de MS (que realmente, después de decirlo lo suficiente, no agregaría pero quería señalar la afirmación ligeramente incorrecta que hizo con nombres de archivo, así como la redundancia / inutilidad en el caso de 'todos').Un simple
find
puede ser útil. alias en tu~/.bashrc
archivo:Inicie una nueva terminal y emita:
fuente
Escribí un script de Python que hace algo similar. Así es como se debe usar este script.
El primer argumento,
path
es el directorio en el que buscaremos de forma recursiva. El segundo argumento,pattern_to_search
es una expresión regular que queremos buscar en un archivo. Usamos el formato de expresión regular definido en la biblioteca Pythonre
. En este script, el.
también coincide con la nueva línea.El tercer argumento,
file_pattern
, es opcional. Esta es otra expresión regular que funciona en un nombre de archivo. Solo se considerarán aquellos archivos que coincidan con esta expresión regular.Por ejemplo, si quiero buscar archivos de Python con la extensión que
py
contienePool(
seguido de wordAdaptor
, hago lo siguiente,Y listo, genera la ruta de los archivos coincidentes y el número de línea en el que se encontró la coincidencia. Si se encontró más de una coincidencia, entonces cada número de línea se agregará al nombre del archivo.
fuente
Si desea usar estrictamente
find
, usefind + grep
:find /path/to/somewhere/ -type f -exec grep -nw 'textPattern' {} \;
pasos:
1.Utilice
find
para buscar archivos,2.Entonces ejecute
grep
en todos ellos.Esto puede darle el poder de
find
buscar archivos.Úselo
-name Pattern
sigrep
solo desea ciertos archivos:find /path/to/somewhere/ -type f -name \*.cpp -exec grep -nw 'textPattern' {} \;
Puedes jugar con él y usar diferentes opciones
find
para mejorar o reducir tu búsqueda de archivos.fuente
Utilizar:
Esto informará cuántas copias de su patrón hay en cada uno de los archivos en el directorio actual.
fuente
grep es tu buen amigo para lograr esto.
Si no le importa el caso del texto para buscar, utilice:
fuente
-
s en la cadena de búsqueda,--
primero querrá pasar a grep; eso puede causar efectos secundarios interesantes de lo contrario!Estoy fascinado por lo simple que grep lo hace con 'rl':
Funciona simplemente perfecto ...
fuente
.txt
) ¿O hay una manera de hacer eso?Para buscar la cadena y generar solo esa línea con la cadena de búsqueda:
p.ej:
Para mostrar el nombre de archivo que contiene la cadena de búsqueda:
p.ej:
fuente
find … -exec grep 'str' {} \;
(si es que tiene que usarlofind
).find
espacios contenidos ... podría terminar congrepping
los archivos incorrectos y / o faltar los archivos correctos por completo. Solo úselofind ... -exec grep ...
si necesita usarlofind
... pero en este caso esgrep -r ...
suficiente.Hay un
ack
herramienta que haría exactamente lo que estás buscando.http://linux.die.net/man/1/ack
Puede ignorar la
-i
búsqueda sensible a mayúsculas y minúsculasfuente
Todas las respuestas anteriores sugieren grep y find. Pero hay otra forma: usar Midnight Commander
Es una utilidad gratuita (30 años, probada por tiempo) que es visual sin ser GUI. Tiene toneladas de funciones, y encontrar archivos es solo una de ellas.
fuente
El siguiente comando funcionará bien para este enfoque:
fuente
find
y luegogrep -r
? Están destinados a lo mismo, por lo que esto es redundante.find
.Evite la molestia e instale ack-grep. Elimina muchos problemas de permisos y citas.
Luego vaya al directorio que desea buscar y ejecute el siguiente comando
fuente