web-dev-qa-db-fra.com

Lister les fichiers contenant un mot particulier dans leur texte

Je voudrais lister les fichiers récursivement et uniquement qui contiennent le mot donné.

Exemple: Vérification de Word 'check', je fais normalement est un grep

$ grep check * -R

Mais comme il y a beaucoup d'occurrences de ce mot, j'obtiens beaucoup de sortie. J'ai donc juste besoin de lister les noms de fichiers qui contiennent le mot de recherche donné. Je suppose qu'une astuce avec find et xargs suffirait ici, mais je n'en suis pas sûr.

Des idées?

30
mtk

Utilisez le -l ou --files-with-matches option qui est documentée comme suit:

Supprimer la sortie normale; au lieu de cela, imprimez le nom de chaque fichier d'entrée à partir duquel la sortie aurait normalement été imprimée. Le balayage s'arrêtera lors du premier match. (-l est spécifié par POSIX.)

Ainsi, pour votre exemple, vous pouvez utiliser ce qui suit:

$ grep check * -lR
40
N.N.
find . -type f -exec grep -l check {} +

Vous ne voulez probablement pas utiliser le -R option qui avec les versions modernes de GNU grep suit les liens symboliques lors de la descente des répertoires. Utilisez le -r option à la place qui depuis la version 2.12 (avril 2012) ne suit plus les liens symboliques.

Si votre grep n'est pas le GNU one, ou est plus ancien que la version 2.12, ou si vous avez besoin que votre code soit portable pour les systèmes GNU Edge non-saignants, utilisez le find commande ci-dessus.

Sinon, vous pouvez faire:

grep -rl check .

N'utilisez pas * (car cela omettrait les fichiers cachés dans le répertoire courant (et dans le répertoire courant uniquement) et causerait des problèmes pour les fichiers dont le nom commence par un -), évitez de passer des options après des arguments car cela n'est pas garanti de fonctionner selon l'environnement et n'est pas portable.

18
Stéphane Chazelas

Essaye ça:

find . -type f | xargs grep -c check $1 | grep -v ":0"

Quant aux drapeaux grep ...

-c renverra un nom de fichier suivi de: et d'un nombre indiquant combien de fois la chaîne de recherche apparaîtra dans le fichier donné.

-v prendra la sortie de la première recherche grep, filtrera les fichiers avec des résultats nuls et imprimera uniquement les fichiers avec des résultats non nuls.

1
brightwellcd

grep -lR "text-to-find" <where-to-find> fonctionne aussi très bien.

par exemple., grep -lR "NAVIGATE" . où se trouve le mot NAVIGATE dans le . dans le répertoire courant.

1
imsrgadich

grep -rin "whatToFind" locationToFInd

par exemple $ grep -rin "vihaan".

recherchera et listera récursivement les noms de fichiers et les lignes correspondantes qui contiennent "vihaan", "." fait référence au répertoire courant.

0
Vihaan Verma
find . -type f | grep "keyword" *

rechercher dans le répertoire courant. Pour rechercher à partir de la racine, spécifiez / au lieu de .

0
Maniraja Jorige