web-dev-qa-db-fra.com

Des alternatives plus rapides à "trouver" et "localiser"?

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?

19
benhsu

Recherche de fichiers source dans un projet

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).

Accélérer la recherche

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'

Accélérer localiser

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.

Supprimez le besoin de chercher

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.

15
RedGrittyBrick

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

9
benhsu

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 ...

5
nobar

Le chercheur d'argent

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

screenshot

3
Pablo Bianchi

Une autre solution simple consiste à utiliser les nouvelles technologies Shell étendues. Autoriser:

  • bash: shopt -s globstar
  • ksh: set -o globstar
  • zsh: déjà activé

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.

2
dannyw