Me gustaría usar "buscar" y localizar "para buscar archivos fuente en mi proyecto, pero tardan mucho en ejecutarse. ¿Hay alternativas más rápidas a estos programas que no conozco, o formas de acelerar el rendimiento? de estos programas?
22
locate
ya debería ser bastante rápido, teniendo en cuenta que usa un índice preconstruido (la advertencia principal es que debe mantenerse actualizado), mientras quefind
tiene que leer los listados del directorio.find /usr/src -name fprintf.c
en mi máquina de escritorio OpenBSD, devuelve las ubicaciones de esos archivos de origen en menos de 10 segundos.locate fprintf.c | grep '^/usr/src.*/fprintf.c$'
vuelve en menos de un segundo. ¿Cuál es su definición de "mucho tiempo para correr" y cómo usafind
ylocate
?Respuestas:
Buscando archivos fuente en un proyecto
Use un comando más simple
En general, es probable que la fuente de un proyecto esté en un lugar, tal vez en algunos subdirectorios anidados no más de dos o tres de profundidad, por lo que puede usar un comando (posiblemente) más rápido como
Hacer uso de los metadatos del proyecto.
En un proyecto de C que habitualmente se tiene un Makefile. En otros proyectos, puede tener algo similar. Estos pueden ser una manera rápida para extraer una lista de archivos (y sus ubicaciones) escribir un script que hace uso de esta información para localizar archivos. Tengo un script "fuentes", por lo que puedo escribir comandos como
grep variable $(sources programname)
.Acelerando encontrar
Busque en menos lugares, en lugar de
find / …
usarfind /path/to/project …
donde sea posible. Simplifique los criterios de selección tanto como sea posible. Use tuberías para diferir algunos criterios de selección si eso es más eficiente.Además, puede limitar la profundidad de búsqueda. Para mí, esto mejora mucho la velocidad de 'encontrar'. Puede usar el modificador -maxdepth. Por ejemplo '-maxdepth 5'
Acelerando localizar
Asegúrese de que está indexando las ubicaciones que le interesan. Lea la página de manual y utilice las opciones que sean apropiadas para su tarea.
Elimina la necesidad de buscar
Tal vez estás buscando porque has olvidado dónde se dice o no se dice algo. En el primer caso, escriba notas (documentación), en el segundo, pregunte? Las convenciones, los estándares y la coherencia pueden ayudar mucho.
fuente
Usé la parte de "acelerar la localización" de la respuesta de RedGrittyBrick. Creé un db más pequeño:
luego lo señaló
locate
:locate -d /home/benhsu/ben.db
fuente
Una táctica que uso es aplicar la
-maxdepth
opción confind
:Repita con profundidades crecientes hasta que encuentre lo que está buscando o se canse de buscar. Es probable que las primeras iteraciones vuelvan instantáneamente.
Esto garantiza que no pierdas el tiempo inicial mirando a través de las profundidades de los subárboles masivos cuando lo que estás buscando es más probable que esté cerca de la base de la jerarquía.
Aquí hay un script de ejemplo para automatizar este proceso (Ctrl-C cuando ve lo que quiere):
Tenga en cuenta que la redundancia inherente involucrada (cada pasada tendrá que atravesar las carpetas procesadas en pasadas anteriores) se optimizará en gran medida a través del almacenamiento en caché de disco.
¿Por qué no
find
tiene este orden de búsqueda como una función incorporada? Tal vez porque sería complicado / imposible de implementar si asumiera que el recorrido redundante es inaceptable. La existencia de la-depth
opción sugiere la posibilidad, pero desgraciadamente ...fuente
Otra solución fácil es usar un globing de shell extendido más nuevo. Para permitir:
Luego, puede ejecutar comandos como este en el directorio fuente de nivel superior:
Esto tiene la ventaja de que busca de forma recursiva en todos los subdirectorios y es muy rápido.
fuente
El buscador de plata
Puede resultarle útil para buscar muy rápidamente el contenido de una gran cantidad de archivos de código fuente. Solo escribe
ag <keyword>
. Aquí algunos de los resultados de miapt show silversearcher-ag
:Usualmente lo uso con:
fuente
.gitignore
los archivos y saltos.git
,.svn
,.hg
.. carpetas..gitignore
e ignora los archivos ocultos y binarios de forma predeterminada. También tienen más contribuyentes, más estrellas en Github (14700 vs 8300) y ya está en repos de las principales distribuciones. Proporcione una comparación actualizada de fuentes confiables de terceros. Sin embargo,ripgrep
parece una gran pieza de software.ripgrep
ninguna manera, solo se ajusta a mis requisitos, así que dejé de buscar otras opciones..gitignore
también respeta . Dicho eso,rg
es absolutamente asombroso. En primer lugar, tiene soporte Unicode. En mi experiencia,rg
al menos dos veces más rápido queag
(YMMV), supongo que se debe al analizador de expresiones regulares de Rust, que obviamente todavía no estaba listo en los añosag
nuevos.rg
puede proporcionar resultados deterministas (pero no lo hace de manera predeterminada), puede incluir en la lista negra los tipos de archivos dondeag
solo puede incluir en la lista blanca, puede ignorar los archivos según el tamaño (registros de bye bye). Todavía lo usoag
en caso de que necesite coincidencia multilínea, lo querg
no puede hacer.Para encontrar un reemplazo, consulte fd . Tiene una interfaz más simple / más intuitiva que el comando de búsqueda original, y es bastante más rápido.
fuente