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 string
m'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).
*
? 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*
.grep -nr MobileAppSer* .
1. Supposons que nous avons 3 fichiers dans le répertoire correspondant actuelMobileAppSer*
modèle générique: nomMobileAppServlet.java
,MobileAppServlet.class
,MobileAppServlet.txt
. Ensuite ,grep
sera 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.MobileAppSer*
modèle générique,grep
recevra l'argumentMobileAppSer*
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.Notes supplémentaires: cela satisfait 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 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).la source
grep -inr "my word" .
-r
pour grep signifie rechercher dans les sous-répertoires récursivement et-n
signifie préfixer chaque ligne de sortie avec le numéro de ligne correspondant du fichier qui contient cette ligne.man grep
décrit tout cela, et bien plus encore.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.
-n
imprimera le numéro de ligne, où il correspond dans le fichier.-i
recherchera la casse (majuscules / non majuscules).la source
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:
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:
Il est important d'inclure le "." car cela indique à grep de rechercher CE répertoire.
la source
Il y a aussi:
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",-print0
signifie "les imprimer sur la sortie standard en utilisant des caractères nuls comme délimiteurs". La sortie defind
est envoyée àxargs -0
et 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'appliquegrep -li word
à chaque ensemble de fichiers. Sur legrep
,-l
signifie "lister les fichiers qui correspondent" et-i
signifie "insensible à la casse"; vous pouvez généralement combiner des options de caractère unique afin que vous puissiez voir-li
plus souvent que-l -i
.Si vous n'utilisez pas
-print0
et-0
que vous rencontrerez des problèmes avec les noms de fichiers contenant des espaces, leur utilisation est une bonne habitude.la source
man find
partir de la ligne de commande pour voir quelles options votrefind
supporte.Pourquoi ne pas faire une recherche récursive pour trouver toutes les instances dans les sous-répertoires:
Cela fonctionne comme un charme.
la source
grep -r "yourstring" *
Trouvera "votre chaîne" dans tous les fichiers et dossiersMaintenant, 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
grep -rE "yourstring|yourotherstring|$" *
recherchera les emplacements de liste oùyourstring
ouyourotherstring
correspondla source
Une autre option que j'aime utiliser:
-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 {}").
la source
-R suit également les liens symboliques quand -r ne le fait pas.
la source
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:
Cela recherche en fait la chaîne
"yourStrin"
et"g"
0 ou plusieurs fois.Donc, la bonne façon de le faire est:
Cette commande recherche la chaîne avec n'importe quel caractère avant et après dans le dossier en cours.
la source
grep -nr yourString
fonctionne aussi, car il recherche le nu suryourString
la première ligne (ou du moins il le fait sur mon système, OSX Lion)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'
-w
option:la source
Exécutez (terminal) la commande suivante dans le répertoire. Il vérifiera récursivement les sous-répertoires également.
la source
L'exemple suivant recherche récursivement
your search string
dans les fichiers*.xml
et*.js
situés quelque part dans les dossierspath1
,path2
etpath3
.Vous pouvez donc rechercher dans un sous-ensemble de fichiers de nombreux répertoires, en fournissant simplement les chemins à la fin.
la source
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.
la source