Quiero encontrar todos los archivos que contienen una cadena de texto específica. El grepcomando 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 quegrepdeja de leer un archivo en la primera coincidencia con esta opción).fuente
-rlFinterruptores,-Fpara "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.-ibandera que ignora el caso.--recursiveopció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:
-Hhace que se imprima el nombre del archivo (implícito cuando se buscan varios archivos)-rhace una búsqueda recursiva-nhace que se imprima el número de líneapath/to/filespuede ser.buscar en el directorio actualOtras opciones que encuentro muy útiles:
-Iignorar archivos binarios (complemento:-atratar todos los archivos como texto)-Ftratarsearch termcomo un literal, no como una expresión regular-ihacer una búsqueda entre mayúsculas y minúsculas--color=alwayspara forzar los colores incluso al pasar a travésless. Para crearlesscolores de soporte, debe usar la-ropción:--exclude-dir=dirútil para excluir directorios como.svny.git.fuente
-Hen 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
findes 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 fespecifica que solo debe procesar archivos, no directorios, etc.-exec grepespecifica 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
lsusa para recursivo. Dado que grep acepta ambos, no hay razón para no usarlo.EDITAR: por HVNSweeting, aparentemente
-Rseguirá enlaces simbólicos donde-rno lo hará.fuente
shopt -s dotglob(recuerde-scomo "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 dotglobsolo 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.Rva a seguir enlaces simbólicos,rnoSi estás dispuesto a probar algo nuevo, dale
ackuna oportunidad. El comando para buscar recursivamente el directorio actualstringes:La instalación es bastante simple:
(Siempre que ya tenga el directorio
~/biny esté preferiblemente en suPATH.)fuente
chmodcomando? ¿Son específicoschmodo están relacionados con bash (la!#:3parte)?!es un designador de eventos . Son bastante poderosos para evitar repeticiones.!#:3hace referencia al tercer token de la línea de comando hasta ahora, es decir,~/bin/acken 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
findygrepsoluciona 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
.bashrco.bash_aliaseso en un script:Uso:
wherein /path/to/search/in/ searchkeywordejemplo:
(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 usafindcongrep... 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
grepherramienta para buscar de forma recursiva la carpeta actual con-rpará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
findsintaxis en su lugar como:Alternativamente uso
ripgrep.ripgrepSi 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,pto 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
.gitignorearchivos, 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
xargssin-print0opciónfindy-0opción axargsestá 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
grepdevolverá 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
-Oque existe en GNU grep.fuente
Un script (buscar en el código) para buscar en C, código CPP:
Utilizar:
fuente