J'aimerai utiliser "trouver" et "localiser" pour rechercher des fichiers source dans mon projet, mais leur exécution est longue. 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?
tilisez une commande plus simple
Généralement, la source d'un projet est probablement au même endroit, peut-être dans quelques sous-répertoires imbriqués d'au plus deux ou trois profondeurs. Vous pouvez donc utiliser une commande (éventuellement) plus rapide, telle que
(cd /path/to/project; ls *.c */*.c */*/*.c)
tiliser les métadonnées du projet
Dans un projet C, vous avez généralement un fichier Makefile. Dans d'autres projets, vous pouvez avoir quelque chose de similaire. Celles-ci peuvent constituer un moyen rapide d'extraire une liste de fichiers (et leur emplacement) pour écrire un script utilisant ces informations pour localiser des fichiers. J'ai un script "sources" pour pouvoir écrire des commandes telles que grep variable $(sources programname)
.
Recherchez moins d'endroits, au lieu de find / …
, utilisez find /path/to/project …
si possible. Simplifiez autant que possible les critères de sélection. Utilisez les pipelines pour différer certains critères de sélection si cela est plus efficace.
En outre, vous pouvez limiter la profondeur de la recherche. Pour moi, cela améliore beaucoup la vitesse de "trouver". Vous pouvez utiliser le commutateur -maxdepth. Par exemple '-maxdepth 5'
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.
-U <dir>
Create slocate database starting at path <dir>.
-d <path>
--database=<path> Specifies the path of databases to search in.
-l <level>
Security level. 0 turns security checks off. This will make
searchs faster. 1 turns security checks on. This is the
default.
Peut-être cherchez-vous parce que vous avez oublié où quelque chose est ou n’a pas été dit. Dans le premier cas, écrivez des notes (documentation), dans le second, demandez? Les conventions, les normes et la cohérence peuvent aider beaucoup.
J'ai utilisé la partie "accélération de la localisation" de la réponse de RedGrittyBrick. J'ai créé une plus petite base de données:
updatedb -o /home/benhsu/ben.db -U /home/benhsu/ -e "uninteresting/directory1 uninteresting/directory2"
__ y a alors indiqué locate
: locate -d /home/benhsu/ben.db
Une tactique que j'utilise consiste à appliquer l'option -maxdepth
avec find
:
find -maxdepth 1 -iname "*target*"
Répétez avec des profondeurs croissantes jusqu'à ce que vous trouviez ce que vous cherchez ou que vous en ayez marre de chercher. Les premières itérations sont susceptibles de revenir instantanément.
Cela garantit que vous ne perdez pas de temps au début à regarder à travers les profondeurs d'immenses sous-arbres lorsque ce que vous recherchez a plus de chances 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):
(
TARGET="*target*"
for i in $(seq 1 9) ; do
echo "=== search depth: $i"
find -mindepth $i -maxdepth $i -iname "$TARGET"
done
echo "=== search depth: 10+"
find -mindepth 10 -iname $TARGET
)
Notez que la redondance inhérente impliquée (chaque passe devra traverser les dossiers traités lors des passes précédentes) sera largement optimisée grâce à la mise en cache sur disque.
Pourquoi find
ne possède-t-il pas cet ordre de recherche en tant que fonctionnalité intégrée? Peut-être parce que ce serait compliqué/impossible à mettre en œuvre si vous supposiez que le parcours redondant était inacceptable. L'existence de l'option -depth
laisse entrevoir cette possibilité, mais hélas ...
Vous pourriez le trouver utile pour rechercher très rapidement le contenu d’un grand nombre de fichiers de code source. Il suffit de taper ag <keyword>
. Voici une partie de la sortie de mon apt show silversearcher-ag
:
Je l'utilise habituellement avec:
-G
--file-search-regex PATTERN
Seulement les fichiers de recherche dont le nom correspond à PATTERN.
ag -G "css$" important
Une autre solution simple consiste à utiliser les nouvelles technologies Shell étendues. Autoriser:
Ensuite, vous pouvez exécuter des commandes comme celle-ci dans le répertoire source de niveau supérieur:
# grep through all c files
grep printf **/*.c
# grep through all files
grep printf ** 2>/dev/null
Cela présente l’avantage qu’il effectue une recherche récursive dans tous les sous-répertoires et qu’il est très rapide.