web-dev-qa-db-fra.com

Comment utiliser grep pour rechercher un mot dans un dossier?

Sous Windows, j'aurais fait une recherche pour trouver un mot dans un dossier. De même, je veux savoir si un mot spécifique apparaît dans un répertoire contenant de nombreux sous-répertoires et fichiers. Mes recherches pour la syntaxe grep indiquent que je dois spécifier le nom du fichier, c'est-à-dire grep string filename.

Maintenant, je ne connais pas le nom du fichier, alors que dois-je faire? Un ami a suggéré de faire grep -nr string, mais je ne sais pas ce que cela signifie et je n’obtiens aucun résultat (il n’ya pas de réponse tant que je n’ai pas envoyé de message). ctrl + c).

467
kiki
grep -nr 'yourString*' .

Le point à la fin recherche le répertoire en cours. Signification pour chaque paramètre:

-n            Show relative line number in the file
'yourString*' String for search, followed by a wildcard character
-r            Recursively search subdirectories listed
.             Directory for search (current directory)

grep -nr 'MobileAppSer*' . (Trouverait MobileAppServlet.Java ou MobileAppServlet.class ou MobileAppServlet.txt; 'MobileAppASer*.*' est une autre façon de faire la même chose.)

Pour vérifier plus de paramètres, utilisez man grep command.

671
Manish Ranjan

grep -nr string my_directory

Notes complémentaires: ceci respecte la syntaxe grep [options] string filename car dans les systèmes de type Unix, un répertoire est une sorte de fichier (il existe un terme "fichier normal" pour désigner spécifiquement des entités appelées simplement "fichiers" dans Windows).

grep -nr string lit le contenu à rechercher à partir de l’entrée standard, c’est pourquoi il attend simplement votre saisie et cesse de le faire lorsque vous appuyez sur ^ C (il s’arrête également sur ^ D, qui est la combinaison de touches du fichier).

103
usta

GREP: Global Print Expression Regular/Analyseur/Processeur/Programme.
Vous pouvez l’utiliser pour effectuer une recherche dans le répertoire actuel. 
Vous pouvez spécifier -R pour "récursif", ce qui signifie que le programme effectue une recherche dans tous les sous-dossiers, leurs sous-dossiers, leurs sous-dossiers, etc.

grep -R "your Word" .

-n imprimera le numéro de ligne, où il correspond dans le fichier.
-i recherchera la casse (majuscules/minuscules).

grep -inR "your regex pattern" .
54
Stefan Steiger

Il y a aussi:

find directory_name -type f -print0 | xargs -0 grep -li Word

mais cela pourrait être un peu beaucoup pour un débutant.

find est un répertoire généraliste, -type f signifie "recherchez les fichiers bruts plutôt que les répertoires et les canaux nommés et ce que vous avez", -print0 signifie "affichez-les sur la sortie standard en utilisant des caractères nuls comme délimiteurs". La sortie de find est envoyée à xargs -0. Elle saisit son entrée standard en morceaux (pour éviter les limitations de longueur de ligne de commande) en utilisant des caractères nuls comme séparateur d’enregistrement (plutôt que la nouvelle ligne standard) et applique grep -li Word à chaque ensemble de fichiers. Sur grep, -l signifie "lister les fichiers correspondants" et -i signifie "insensible à la casse"; vous pouvez généralement combiner des options à un seul caractère pour que vous voyiez -li plus souvent que -l -i.

Si vous n'utilisez pas -print0 et -0, vous rencontrerez des problèmes avec les noms de fichiers contenant des espaces. Leur utilisation est donc une bonne habitude.

24
mu is too short
grep -nr search_string search_dir

fera une recherche RECURSIVE (le répertoire et tous ses sous-répertoires) pour la chaîne de recherche. (comme correctement répondu par usta).

La raison pour laquelle vous ne recevez aucune réponse à la suggestion de votre ami de:

grep -nr string

est parce qu'aucun répertoire n'a été spécifié. Si vous vous trouvez dans le répertoire dans lequel vous souhaitez effectuer la recherche, vous devez procéder comme suit:

grep -nr string .

Il est important d'inclure le '.' caractère, car cela indique à grep de rechercher dans cet annuaire.

22
Nico Huysamen

Pourquoi ne pas faire une recherche récursive pour trouver toutes les instances dans les sous-répertoires:

grep -r 'text' *

Cela fonctionne comme un charme.

4
Paxwell
  1. grep -r "yourstring" * Trouvera "yourstring" dans tous les fichiers et dossiers 

Maintenant, si vous voulez chercher deux chaînes différentes en même temps, vous pouvez toujours utiliser l'option E et ajouter des mots pour la recherche. exemple après la pause

  1. grep -rE "yourstring|yourotherstring|$" * recherchera les emplacements de liste où yourstring ou yourotherstring correspond
4
Nwaoga

Une autre option que j'aime utiliser:

find folder_name -type f -exec grep your_text  {} \;

-type f ne vous renvoie que des fichiers et non des dossiers

-exec et {} exécute le grep sur les fichiers trouvés dans la recherche (la syntaxe exacte est "-exec commande {}").

3
jfhfhf839

La réponse que vous avez sélectionnée est correcte et fonctionne, mais ce n'est pas la bonne façon de le faire, car:

grep -nr yourString* .

Cela recherche en fait la chaîne "yourStrin" et "g" 0 ou plusieurs fois.

Donc, la bonne façon de le faire est:

grep -nr \w*yourString\w* .

Cette commande recherche la chaîne avec n'importe quel caractère avant et après sur le dossier actuel.

1
eLRuLL

Semblable à la réponse publiée par @eLRuLL, un moyen plus simple de spécifier une recherche qui respecte les limites de Word consiste à utiliser l'option -w:

grep -wnr "yourString" .
0
Mike Slinn
grep -R "string" /directory/

Il s’agissait de grep -r mais j’ai remarqué que cela ne fonctionnait plus dans ma version.

grep --version
grep (GNU grep) 3.1
0
DimiDak

Ne pas utiliser grep. Télécharger Silver Searcher ou ripgrep . Ils sont tous les deux exceptionnels et bien plus rapides que grep ou ack avec des tonnes d’options.

0
AAAfarmclub