Recherche récursivement une chaîne dans le répertoire courant

15

Je veux rechercher tous les fichiers récursivement à partir du répertoire dans lequel je suis pour une chaîne particulière.

j'ai essayé

grep -r -i my_string

et je l'ai essayé dans un dossier de test avec deux petits fichiers, mais il n'a pas trouvé la chaîne.

De plus, existe-t-il un moyen spécial de définir «contient» plutôt que de faire correspondre le mot entier?

David
la source
3
Essayez grep -r -o -i "your_string" *(avec "guillemets").
pl1nk
je reçois quelques messages de permission refusée, est-ce qu'il ignore simplement ces fichiers mais continue de vérifier le reste?
David
À droite, ces fichiers sont ignorés.
pl1nk

Réponses:

27

Recherchez-vous un nom de fichier ou un mot dans un fichier? grep recherche dans les fichiers, ce qui semble être ce que vous voulez.

grep utilise des expressions régulières - en fait, c'est ce que la partie "re" représente. Ainsi, il n'utilise pas les caractères génériques bash normaux; c'est-à-dire, abc*ne trouverait pas de mots commençant par abc, il trouverait des mots commençant par ab, puis zéro ou plusieurs c suivants. Mais oui, si vous lui donnez simplement un modèle, il le trouvera n'importe où, sans connaissance de mots entiers. Si vous vouliez trouver des mots entiers, vous auriez besoin de créer une expression régulière pour le dire.

Mais, comme la plupart des commandes, vous devez mettre le (s) nom (s) de fichier à la fin de la commande, donc votre exemple resterait là et attendrait le nom de fichier.

Comme l'a dit @plink, utilisez

grep -r -o -i "your_string" *

(ou *.*, ou autre spécification de fichier). Les erreurs peuvent être ignorées. Si vous obtenez beaucoup d'erreurs, vous pouvez ajouter 2>/dev/nullà la fin, ce qui redirigera stderr vers un périphérique nul.

Marty Fried
la source
6
Pour les curieux: -r signifie récursif (c'est-à-dire qu'il regarde dans le dossier actuel et TOUS les dossiers dans le dossier actuel ET tous les dossiers dans ce dossier ... jusqu'à l'infini), -o signifie qu'il n'affiche pas toute la ligne, et -i est ignorer la casse.
BKSpurgeon
@johnsnails Le backtick n'est pas nécessaire. Il est plus probable qu'il s'agisse d'une erreur de formatage sur Stack Exchange lors de la publication en tant que bloc de code en ligne.
tom_mai78101
Ouais ça a du sens.
johnsnails