Quiero encontrar todos los archivos que contienen una cadena de texto específica. El grep
comando funciona, pero no sé cómo usarlo para cada directorio (solo puedo hacerlo para mi directorio actual). Intenté leer man grep
, pero no me sirvió de nada.
command-line
grep
Sonrisa cazador
fuente
fuente
--include="*.C"
opción, @ user311346, gracias a @Lekensteyn.Respuestas:
Sería mejor usar
dónde
-r
(o--recursive
) la opción se usa para recorrer también todos los subdirectorios de/path
, mientras que-l
(o--files-with-matches
) la opción se usa para imprimir solo nombres de archivos de archivos coincidentes, y no las líneas coincidentes (esto también podría mejorar la velocidad, dado quegrep
deja de leer un archivo en la primera coincidencia con esta opción).fuente
-rlF
interruptores,-F
para "cadena fija" (y no regexp, por ejemplo). Por supuesto, si la tarea estaba usando expresiones regulares, entonces discúlpeme. Claro, la misma teoría sin -r también, a menudo veo que las personas asumen grep búsquedas de "texto" y puede causar problemas especiales que significan algo como una expresión regular.-i
bandera que ignora el caso.--recursive
opción, hay muchas opciones y escenarios de uso de los que se puede hablar. Comencé con la respuesta aceptada @dmityugov y modifiqué para trabajar sin ellafind
.--include '*.h'
Si está buscando líneas que coincidan en los archivos, mi comando favorito es:
-H
hace que se imprima el nombre del archivo (implícito cuando se buscan varios archivos)-r
hace una búsqueda recursiva-n
hace que se imprima el número de líneapath/to/files
puede ser.
buscar en el directorio actualOtras opciones que encuentro muy útiles:
-I
ignorar archivos binarios (complemento:-a
tratar todos los archivos como texto)-F
tratarsearch term
como un literal, no como una expresión regular-i
hacer una búsqueda entre mayúsculas y minúsculas--color=always
para forzar los colores incluso al pasar a travésless
. Para crearless
colores de soporte, debe usar la-r
opción:--exclude-dir=dir
útil para excluir directorios como.svn
y.git
.fuente
-H
en una carpeta es redundante, si hay más de un archivo, como es probable. De hecho, la página del manual dice-H, --with-filename: Print the file name for each match. This is the default when there is more than one file to search.
--include '*.*'
grep --exclude='*~' ...
Creo que puedes usar algo como esto:
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.-type f
especifica que solo debe procesar archivos, no directorios, etc.-exec grep
especifica que para cada archivo encontrado, debe ejecutar el comando grep, pasando su nombre de archivo como argumento, reemplazándolo{}
por el nombre de archivofuente
-name '*.py'
restricciones restringe las coincidencias a los archivos que terminan en '.py'.... -exec bash -c 'grep -r "mystring" {} && echo {}' \;
Mi comando predeterminado es
Yo uso un capitol 'R' porque lo
ls
usa para recursivo. Dado que grep acepta ambos, no hay razón para no usarlo.EDITAR: por HVNSweeting, aparentemente
-R
seguirá enlaces simbólicos donde-r
no lo hará.fuente
shopt -s dotglob
(recuerde-s
como "set"). Tenga cuidado al eliminar archivos entonces. Si tiene dotglob habilitado,rm -r *
elimina todo en el directorio actual, pero también el directorio que se..
encuentra arriba porque coincide. Para deshabilitar dotglob, useshopt -u dotglob
("unset"). Sin embargo, los cambios son temporales, solo se aplica al shell actual.shopt -s dotglob & <grep cmd> & shopt -y dotglob
solo más conveniente? De esta manera no tendremos que preocuparnos por restablecerlogrep -Rin string .
en la mayoría de estos casos. Solo uso * porque parece ser más natural.R
va a seguir enlaces simbólicos,r
noSi estás dispuesto a probar algo nuevo, dale
ack
una oportunidad. El comando para buscar recursivamente el directorio actualstring
es:La instalación es bastante simple:
(Siempre que ya tenga el directorio
~/bin
y esté preferiblemente en suPATH
.)fuente
chmod
comando? ¿Son específicoschmod
o están relacionados con bash (la!#:3
parte)?!
es un designador de eventos . Son bastante poderosos para evitar repeticiones.!#:3
hace referencia al tercer token de la línea de comando hasta ahora, es decir,~/bin/ack
en este caso.El comando rgrep está dedicado para tal necesidad
Si no está disponible, puede obtenerlo así
Puede establecer directamente en sus opciones grep predeterminadas como se describe anteriormente.
Yo personalmente uso
tema relacionado: cómo usar siempre rgrep con color
fuente
Actualización 2:
Esta línea de comandos utiliza
find
ygrep
soluciona el problema:--color=<always or auto>
para salida en color:Ejemplo:
Un ejemplo se ejecuta en la siguiente instantánea:
Actualización 1:
Puedes probar el siguiente código; como una función en su
.bashrc
o.bash_aliases
o en un script:Uso:
wherein /path/to/search/in/ searchkeyword
ejemplo:
(Nota: como se sugiere en los comentarios a continuación por @enzotib, esto no funciona con archivos / directorios que incluyen espacios en sus nombres).
Publicación original
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
grep
, además de ser el subconjunto que usafind
congrep
... pero si debe aceptar diferentes interruptores y ajustes como una respuesta distinta, probablemente el mío también encajará aquí ... ¿o difieres? la última actualización hace lo que me gustaría en mi búsqueda: nombres de archivo con líneas con clave de búsqueda y número de línea. también :) y salida de color y filtro de error para una mejor legibilidad ..grep
( GNU o BSD )Puede usar la
grep
herramienta para buscar de forma recursiva la carpeta actual con-r
parámetros, como:Nota:
-r
- Recursivamente busca subdirectorios.Para buscar dentro de archivos específicos, puede usar una sintaxis global 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.Es compatible con los patrones de ignorar especificados en los
.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
(p-C5
. ej. ): 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
Hago esto usando xargs, un comando muy subestimado
find ./ le brinda una lista recursiva de todos los archivos en una carpeta actual y luego la canaliza a xargs que ejecuta el comando grep en cada uno de esos archivos
fuente
xargs
sin-print0
opciónfind
y-0
opción axargs
está en desuso, fallará en los nombres de archivo que contienen espacios.Sé que hay muchas respuestas aquí, pero aquí hay una alternativa si desea agregar otras restricciones al buscar los archivos:
Esto funciona porque
grep
devolverá 0 si encuentra un resultado, 1 de lo contrario. Por ejemplo, puede encontrar archivos de 1 MB de tamaño y que contengan algo:Para múltiples requisitos, probablemente desee utilizar el indicador de optimizador
-O
que existe en GNU grep.fuente
Un script (buscar en el código) para buscar en C, código CPP:
Utilizar:
fuente