61 votes

Bash : existe-t-il un moyen de rechercher une chaîne particulière dans un répertoire de fichiers ?

Duplicata possible :
Recherche d'un modèle de texte sous linux

Dans bash, je me demandais s'il existait des commandes qui vous permettraient de savoir si une chaîne de caractères particulière que vous recherchez existe dans les fichiers situés dans le répertoire actuel dans lequel vous vous trouvez.

Supposons que vous cherchiez la fonction "toUpperCase()" dans un ensemble de fichiers C dans votre répertoire actuel. Il y a beaucoup de fichiers, donc vous ne voudriez pas ouvrir manuellement chacun d'entre eux en utilisant vim et vérifier la chaîne 'toUpperCase' car cela prendrait beaucoup de temps. Si ce n'est pas une ligne de commande bash, existe-t-il une autre méthode pour faire cela efficacement ?

79voto

Mit grep :

grep -R "toUppercase()" *

Ou, si vous avez ack-grep installé, tout simplement :

ack-grep "toUppercase"

Si vous voulez limiter la recherche dans les fichiers C, avec ack-grep :

ack-grep -cc "toUppercase()"

ack-grep peut également être installé sur OSX mais l'exécutable s'appelle juste ack .

12voto

L'outil standard de recherche de texte est grep .

Pour rechercher la chaîne de caractères toUpperCase( en tout .c dans le répertoire actuel :

grep -F 'toUpperCase(' *.c

Si vous voulez aussi regarder dans les sous-répertoires :

grep -r --include='*.c' -F 'toUpperCase('

Si vous cherchez des appels de fonction C, alors ctags peut être un meilleur choix. Vous l'exécutez une fois sur tous vos fichiers sources pour créer un index des identifiants, puis vous utilisez votre éditeur pour naviguer entre les appels. Tous les éditeurs de type vi peuvent utiliser l'outil ctags TAGS fichier. Si vous utilisez Emacs, exécutez le programme similaire etags .

6voto

JdeBP Points 25711

Vous utilisez vim. Vous avez un outil intégré pour faire ça.

Comme on pouvait s'y attendre, il y a déjà sept réponses disant d'utiliser grep . Mais il semble que je sois la seule personne jusqu'à présent à avoir remarqué, à partir de votre question, que vous utilisez vim . Ainsi, bien que vous peut utiliser grep de l'intérieur vim vous pouvez également utiliser vim L'outil intégré de l'UE. Il est invoqué via la commande :vimgrep commandement.

Pour rechercher "tous les fichiers source C dans le répertoire courant pour les appels à la fonction toUpperCase() ", on tape les vim commande

:vimgrep "\<toUpperCase\_s*(" *.c

La liste de correspondances ainsi obtenue est automatiquement chargée dans la liste des corrections rapides, accessible par l'une des deux méthodes suivantes (voir l'aide en ligne pour la différence subtile)

:copen
:cwin

Pour trouver la fonction définition plutôt que de l'appeler, ctags est l'outil, comme mentionné dans Gilles Réponse de la Commission en collaboration avec le :tjump o :tselect des commandes.

Pourquoi utiliser :vimgrep ?

L'aide en ligne ( :help grep ) énumère plusieurs des raisons, que je ne vais pas répéter ici. En outre, comparez l'action de :vimgrep avec celle de dietbuddha Réponse de la Commission . dietbuddha La ligne de commande de l'utilisateur bifurque vers un individu grep pour chaque fichier source C individuel. Il n'emploie même pas xargs pour réduire ces frais généraux. Et vous devez toujours, d'une manière ou d'une autre, analyser la sortie pour invoquer votre éditeur de texte sur les fichiers source pertinents une fois qu'elle est terminée. :vimgrep ne bifurque pas du tout vers de multiples processus supplémentaires, et l'utilisation du résultat est la simplicité même. Il suffit de sélectionner l'une des entrées de la liste de corrections rapides pour positionner automatiquement le curseur sur la ligne correspondante du fichier source.

En fait, il fait exactement ce que vous avez écrit que vous feriez à la main, mais automatiquement. C'est la façon automatisée de faire ces mêmes actions d'éditeur de texte. Il charge le fichier comme s'il était chargé à la main, y recherche une expression régulière (à l'aide de la fonction même la syntaxe des expressions régulières que vous utilisez déjà ailleurs dans le document vim ), enregistre les endroits où des correspondances se produisent, puis décharge le fichier.

2voto

slhck Points 209720

Oui, l'outil s'appelle grep .

La commande grep recherche dans un ou plusieurs fichiers d'entrée les lignes contenant une correspondance avec un motif spécifié. Par défaut, grep imprime les lignes correspondantes.

L'usage de base est :

grep something somewhere

Ou, plus précisément :

grep [some options] pattern file

Dans un cas très simple, vous souhaitez effectuer une recherche récursive dans tous les fichiers, vous fournissez donc l'attribut -r option. Si vous ne vous souciez pas des majuscules ou des minuscules, faites en sorte qu'elles ne soient pas sensibles à la casse avec l'option -i option.

grep -ri "touppercase()" .

Si vous ne voulez que les parties correspondantes, utilisez la fonction -o option.

Grep peut utiliser expressions régulières et il a un grand manuel .

2voto

Keith Sirmons Points 2558

grep est la réponse standard -- en utilisant l'option -r pour effectuer une recherche récursive ou en conjonction avec la commande find (discussion et exemples dans d'autres questions sur ce site, telles que celui-ci )

Mon choix préféré ces derniers temps est ack . Il n'est probablement pas installé sur votre ordinateur, mais vous pouvez l'installer en utilisant apt-get sur Ubuntu ou simplement le télécharger. Des liens, des instructions et les raisons pour lesquelles il est meilleur que grep sont disponibles à l'adresse suivante http://betterthangrep.com/

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X