web-dev-qa-db-fra.com

Rechercher des fichiers et des noms de fichiers à l'aide de Silver Searcher

À l'aide de Silver Searcher, comment puis-je rechercher:

  1. Fichiers (non binaires) avec un mot ou un modèleET
  2. all noms de fichiers, avec un mot ou un modèle, y compris les noms de fichiers binaires.

Autres préférences: aimerait avoir une recherche insensible à la casse et une recherche dans les fichiers de points.


Essayé de faire allusion en utilisant cela sans trop de chance:

alias search="ag -g $1 --smart-case --hidden && ag --smart-case --hidden $1"

22
Jikku Jose

Selon la page de manuel de ag

   -G --file-search-regex PATTERN
          Only search files whose names match PATTERN.

Vous pouvez utiliser l'option -G pour effectuer des recherches sur les fichiers correspondant à un modèle. 

Donc, pour répondre à votre question:

root@Apache107:~/rpm-4.12.0.1# ag -G cpio.c size
rpm2cpio.c
21:    off_t payload_size;
73:    /* Retrieve payload size and compression type. */
76:     payload_size = headerGetNumber(h, RPMTAG_LONGARCHIVESIZE);

la commande ci-dessus recherche Word size dans tous les fichiers correspondant au modèle cpio.c

Référence:
page de manuel de ag version 0.28.0

Note 1:

Si vous recherchez une chaîne dans certains types de fichiers, disons tout le code source C, il existe une fonctionnalité non documentée in ag pour vous aider à limiter rapidement les recherches à certains types de fichiers.

Les commandes ci-dessous à la fois recherchent foo dans tous les fichiers php:

find . -name \*.php -exec grep foo {}
ag --php foo

Alors que find + grep recherche tous les fichiers .php, le commutateur --php de la commande ag recherche en fait les extensions de fichier suivantes:

.php  .phpt  .php3  .php4  .php5  .phtml

Vous pouvez utiliser --cpp pour les fichiers source C++, --hh pour les fichiers .h, --js pour JavaScript, etc. Une liste complète est disponible ici

46
vincentleest

Essayez d'ajouter ceci à votre fichier d'alias. Testé avec zsh mais devrait fonctionner avec bash. Le problème que vous avez rencontré dans votre exemple est que les alias bash ne peuvent pas prendre de paramètres. Vous devez donc d'abord définir une fonction pour utiliser le (s) paramètre (s), puis affecter votre alias à cette fonction.

searchfunction() {
  echo $(ag -g $1 --hidden)
  echo $(ag --hidden -l $1)
}

alias search=searchfunction

Vous pouvez modifier cet exemple pour l'adapter à votre objectif de plusieurs manières, par exemple:

  • ajoute/supprime l'indicateur -l selon que vous voulez ou non que les résultats de texte affichent la correspondance de texte ou uniquement le nom du fichier
  • ajouter des en-têtes pour séparer les résultats de texte et les résultats de nom de fichier
  • dédupliquer les résultats pour prendre en compte les fichiers qui correspondent à la fois au nom de fichier et au texte, etc.

[Edit: suppression du drapeau inutile --smart-case selon le commentaire de Pablo Bianchi]

5
Greg

J'ai trouvé cette question en cherchant la même réponse moi-même. Il ne semble pas que ag ait une capacité native de rechercher des noms de fichiers et de répertoires. Les réponses ci-dessus de Zach Fogg et Jikku Jose fonctionnent toutes les deux, mais la tuyauterie find . peut être très lente si vous travaillez dans un grand répertoire.

Je recommanderais d'utiliser find directement, ce qui est beaucoup plus rapide que de le passer par ag:

Linux (version GNU de find)

find -name [pattern]

OSX (version BSD de find)

find [pattern]

Si vous avez besoin de plus d'aide avec find, ce guide de Digital Ocean, c'est plutôt bien. J'inclus ceci car les pages de manuel de find sont excessivement denses si vous voulez simplement comprendre l'utilisation de base.

4
Greg

Essaye ça:

find . | ag "/.*SEARCHTERM[^/]*$"

La commande find . listera tous les fichiers.

Nous dirigeons la sortie de cela vers la commande ag "/.*SEARCHTERM[^/]*$", qui correspond à SEARCHTERM si elle se trouve dans le nom du fichier, et pas seulement le chemin complet.

4
Zachary Fogg