J'aimerai utiliser "trouver" et localiser "pour rechercher des fichiers source dans mon projet, mais leur exécution prend beaucoup de temps. Existe-t-il des alternatives plus rapides à ces programmes que je ne connais pas, ou des moyens d'accélérer les performances de ces programmes?
22
locate
devrait déjà être assez rapide, étant donné qu'il utilise un index pré-construit (la principale mise en garde étant qu'il doit être mis à jour), tout enfind
devant lire les listes de répertoires.find /usr/src -name fprintf.c
sur ma machine de bureau OpenBSD, il renvoie les emplacements de ces fichiers source en moins de 10 secondes.locate fprintf.c | grep '^/usr/src.*/fprintf.c$'
revient en moins d'une seconde. Quelle est votre définition de "long time to run" et comment utilisez-vousfind
etlocate
?Réponses:
Recherche de fichiers source dans un projet
Utilisez une commande plus simple
En général, la source d'un projet est susceptible d'être à un seul endroit, peut-être dans quelques sous-répertoires imbriqués à pas plus de deux ou trois profondeurs, vous pouvez donc utiliser une commande (éventuellement) plus rapide telle que
Utiliser les métadonnées du projet
Dans un projet C, vous auriez généralement un Makefile. Dans d'autres projets, vous pouvez avoir quelque chose de similaire. Ceux-ci peuvent être un moyen rapide d'extraire une liste de fichiers (et leurs emplacements), d'écrire un script qui utilise ces informations pour localiser les fichiers. J'ai un script "sources" pour pouvoir écrire des commandes comme
grep variable $(sources programname)
.Accélérer la recherche
Recherchez moins d'endroits, au lieu de les
find / …
utiliserfind /path/to/project …
si possible. Simplifiez autant que possible les critères de sélection. Utilisez des pipelines pour différer certains critères de sélection si cela est plus efficace.Vous pouvez également limiter la profondeur de la recherche. Pour moi, cela améliore beaucoup la vitesse de «recherche». Vous pouvez utiliser le commutateur -maxdepth. Par exemple, "-maxdepth 5"
Accélérer la localisation
Assurez-vous qu'il indexe les emplacements qui vous intéressent. Lisez la page de manuel et utilisez les options appropriées à votre tâche.
Supprimer le besoin de recherche
Peut-être que vous cherchez parce que vous avez oublié où quelque chose est ou n'a pas été dit. Dans le premier cas, rédiger des notes (documentation), dans le second, demander? Les conventions, les normes et la cohérence peuvent beaucoup aider.
la source
J'ai utilisé la partie "accélérer la localisation" de la réponse de RedGrittyBrick. J'ai créé une plus petite base de données:
puis l'a pointé
locate
du doigt :locate -d /home/benhsu/ben.db
la source
Une tactique que j'utilise consiste à appliquer l'
-maxdepth
option avecfind
:Répétez avec des profondeurs croissantes jusqu'à ce que vous trouviez ce que vous cherchez, ou que vous en ayez assez de regarder. Les premières itérations sont susceptibles de revenir instantanément.
Cela garantit que vous ne perdez pas de temps à regarder à travers les profondeurs de sous-arbres massifs lorsque ce que vous recherchez est plus susceptible d'être près de la base de la hiérarchie.
Voici un exemple de script pour automatiser ce processus (Ctrl-C lorsque vous voyez ce que vous voulez):
Notez que la redondance inhérente impliquée (chaque passage devra parcourir les dossiers traités dans les passes précédentes) sera largement optimisée grâce à la mise en cache du disque.
Pourquoi
find
cet ordre de recherche n'est-il pas une fonction intégrée? Peut-être parce que ce serait compliqué / impossible à implémenter si vous supposiez que la traversée redondante était inacceptable. L'existence de l'-depth
option laisse entrevoir la possibilité, mais hélas ...la source
Une autre solution simple consiste à utiliser un globbing de shell étendu plus récent. Autoriser:
Ensuite, vous pouvez exécuter des commandes comme celle-ci dans le répertoire source de niveau supérieur:
Cela a l'avantage de rechercher récursivement dans tous les sous-répertoires et est très rapide.
la source
The Silver Searcher
Vous pourriez le trouver utile pour rechercher très rapidement le contenu d'un grand nombre de fichiers de code source. Tapez simplement
ag <keyword>
. Voici une partie de la sortie de monapt show silversearcher-ag
:Je l'utilise habituellement avec:
la source
.gitignore
fichiers et skips.git
,.svn
,.hg
.. dossiers..gitignore
et ignore également les fichiers cachés et binaires par défaut. Ont également plus de contributeurs, plus de stars sur Github (14700 vs 8300) et sont déjà sur des repos de distributions de maires. Veuillez fournir une comparaison fiable et mise à jour des sources tierces. Néanmoins,ripgrep
ressemble à un excellent logiciel.ripgrep
, cela correspondait à mes besoins, j'ai donc arrêté de chercher d'autres options..gitignore
également. Cela dit,rg
c'est absolument incroyable. Tout d'abord, il prend en charge unicode. D'après mon expérience,rg
au moins deux fois plus rapide queag
(YMMV), je suppose que c'est dû à l'analyseur regex de Rust, qui n'était évidemment pas encore prêt dans les annéesag
était nouveau.rg
peut donner une sortie déterministe (mais ne le fait pas par défaut), il peut mettre sur liste noire les types de fichiers oùag
ne peut que figurer sur la liste blanche, il peut ignorer les fichiers en fonction de la taille (bye bye logs). J'utilise toujoursag
au cas où j'aurais besoin d'une correspondance multiligne, ce quirg
ne peut pas le faire.Pour trouver un remplacement, consultez fd . Il a une interface plus simple / plus intuitive que la commande find originale, et est un peu plus rapide.
la source