Comment puis-je utiliser grep pour trouver un mot dans un dossier?

542

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 de syntaxe grep montrent que je dois spécifier le nom de fichier, c'est-à-dire grep string filename.

Maintenant, je ne connais pas le nom du fichier, alors que dois-je faire? Un ami grep -nr stringm'a suggéré de le faire , mais je ne sais pas ce que cela signifie et je n'ai obtenu aucun résultat (il n'y a pas de réponse avant d'émettre un ctrl + c).

kiki
la source

Réponses:

849
grep -nr 'yourString*' .

Le point à la fin recherche le répertoire courant. 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.javaou MobileAppServlet.classou MobileAppServlet.txt; 'MobileAppASer*.*'est une autre façon de faire la même chose.)

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

Manish Ranjan
la source
14
Quel est le problème *? Il en résultera soit une expansion de caractères génériques du shell (s'il existe des noms de fichiers correspondant au modèle de caractères génériques), soit grep le prendra comme opérateur de répétition 0 ou plus pour le caractère précédent *.
usta
7
Maintenant , nous allons examiner les possibilités de grep -nr MobileAppSer* .1. Supposons que nous avons 3 fichiers dans le répertoire correspondant actuel MobileAppSer*modèle générique: nom MobileAppServlet.java, MobileAppServlet.class, MobileAppServlet.txt. Ensuite , grepsera appelé comme ceci: grep -nr MobileAppServlet.class MobileAppServlet.java MobileAppServlet.txt .. Cela signifie rechercher le texte "MobileAppServlet.class" dans les fichiers MobileAppServlet.java, MobileAppServlet.txt et ailleurs dans le répertoire actuel - ce qui n'est sûrement pas ce que l'utilisateur veut ici.
usta
7
2. Dans le cas où il n'y a aucun fichier dans le répertoire courant correspondant au MobileAppSer*modèle générique, greprecevra l'argument MobileAppSer*tel quel et le prendra donc comme recherche de texte "MobileAppSe" suivi de 0 ou plusieurs occurrences de "r", donc il essayer de trouver des textes "MobileAppSe", "MobileAppSer", "MobileAppSerr", "MobileAppSerrr", etc. dans le contenu des fichiers du répertoire actuel - pas ce que l'utilisateur veut non plus.
usta
5
C'est un choix douteux de regex. Usta l'a souligné.
kindasimple
117
grep -nr string my_directory

Notes supplémentaires: cela satisfait la syntaxe grep [options] string filenamecar 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 qui ne sont appelées que "fichiers" dans Windows).

grep -nr string lit le contenu à rechercher à partir de l'entrée standard, c'est pourquoi il n'attend que l'entrée de votre part, et arrête de le faire lorsque vous appuyez sur ^ C (il s'arrêterait également sur ^ D, qui est la combinaison de touches pour la fin de -fichier).

usta
la source
1
Hé, donc si je veux rechercher une chaîne quel que soit le cas, dois-je le faire: grep -i -nr "my word".
kiki
2
@kiki: Oui, ce qui équivaut àgrep -inr "my word" .
usta
16
@kiki: -rpour grep signifie rechercher dans les sous-répertoires récursivement et -nsignifie préfixer chaque ligne de sortie avec le numéro de ligne correspondant du fichier qui contient cette ligne. man grepdécrit tout cela, et bien plus encore.
usta
62

GREP : Global Regular Expression Print / Parser / Processor / Program.
Vous pouvez l'utiliser pour rechercher le répertoire actuel.
Vous pouvez spécifier -R pour "récursif", ce qui signifie que le programme recherche dans tous les sous-dossiers, et leurs sous-dossiers, et les sous-dossiers de leur sous-dossier, etc.

grep -R "your word" .

-nimprimera le numéro de ligne, où il correspond dans le fichier.
-irecherchera la casse (majuscules / non majuscules).

grep -inR "your regex pattern" .
Stefan Steiger
la source
3
./* signifie tous les fichiers du répertoire courant, -R signifie récursif (recherche dans les sous-répertoires, etc.)
Stefan Steiger
25
grep -nr search_string search_dir

fera une RECURIVE (c'est-à-dire le répertoire et tous ses sous-répertoires) recherche la chaîne de recherche. (comme correctement répondu par usta).

La raison pour laquelle vous n'avez reçu aucune réponse avec la suggestion de votre ami:

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 "." car cela indique à grep de rechercher CE répertoire.

Nico Huysamen
la source
Salut, que dois-je faire si je dois rechercher 2 mots avec un espace entre les deux? Les mots doivent-ils être spécifiés entre guillemets? ie grep -nr "ma parole".
kiki
24

Il y a aussi:

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

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

find est un marcheur / listeur de répertoire à usage général, -type f signifie "rechercher des fichiers simples plutôt que des répertoires et des canaux nommés et ce que vous avez", -print0signifie "les imprimer sur la sortie standard en utilisant des caractères nuls comme délimiteurs". La sortie de findest envoyée à xargs -0et qui 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 s'applique grep -li wordà chaque ensemble de fichiers. Sur le grep, -lsignifie "lister les fichiers qui correspondent" et -isignifie "insensible à la casse"; vous pouvez généralement combiner des options de caractère unique afin que vous puissiez voir -liplus souvent que -l -i.

Si vous n'utilisez pas -print0et -0que vous rencontrerez des problèmes avec les noms de fichiers contenant des espaces, leur utilisation est une bonne habitude.

mu est trop court
la source
1
@mmmshuddup: Merci. Je me sens mal si je ne donne pas d'explication dans le cadre de la réponse, surtout lorsque je travaille avec un débutant.
mu est trop court
1
C'est ce que j'ai le plus apprécié sur ce site. Il est important de se rappeler que nous étions tous débutants une fois et que ce n'est pas facile d'arriver dans le monde de la technologie!
Oui Barry
puis-je exclure certains répertoires? @muistooshort
Ferologics
@Ferologics Il devrait y avoir, vérifiez à man findpartir de la ligne de commande pour voir quelles options votre findsupporte.
mu est trop court
8

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.

Paxwell
la source
1
Pas besoin de citer une chaîne de recherche sans caractères spéciaux comme des espaces
Scott Stensland
5
  1. grep -r "yourstring" * Trouvera "votre chaîne" dans tous les fichiers et dossiers

Maintenant, si vous souhaitez rechercher 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ù yourstringou yourotherstringcorrespond
Nwaoga
la source
4

Une autre option que j'aime utiliser:

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

-type f vous renvoie uniquement des fichiers et non des dossiers

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

jfhfhf839
la source
4
grep -R "string" /directory/

-R suit également les liens symboliques quand -r ne le fait pas.

DimiDak
la source
2

La réponse que vous avez sélectionnée est correcte et cela 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 dans le dossier en cours.

eLRuLL
la source
2
mais grep -nr yourStringfonctionne aussi, car il recherche le nu sur yourStringla première ligne (ou du moins il le fait sur mon système, OSX Lion)
theheadofabroom
1

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

grep -wnr "yourString" .
Mike Slinn
la source
Dans l'invite cmd ou le terminal Windows, le terme grep n'est pas reconnu
kouty
@kouty grep est une commande Unix. itechtics.com/using-findstr-windows
Hugo M. Zuleta
1

Exécutez (terminal) la commande suivante dans le répertoire. Il vérifiera récursivement les sous-répertoires également.

grep -r 'your string goes here' * 
Iwantha
la source
0

L'exemple suivant recherche récursivement your search stringdans les fichiers *.xmlet *.jssitués quelque part dans les dossiers path1, path2et path3.

grep -r --include=*.xml --include=*.js "your search string" path1 path2 path3

Vous pouvez donc rechercher dans un sous-ensemble de fichiers de nombreux répertoires, en fournissant simplement les chemins à la fin.

yucer
la source
-4

N'utilisez pas grep. Télécharger Silver Searcher ou ripgrep . Ils sont à la fois exceptionnels et beaucoup plus rapides que grep ou ack avec des tonnes d'options.

AAAfarmclub
la source
2
Ces outils sont peut-être excellents, mais cela ne répond pas à la façon dont j'utiliserais ces outils pour accomplir ce que le PO demande.
jmathew