Liste les fichiers contenant un mot particulier dans leur texte

30

Je voudrais lister de manière récursive et unique les fichiers qui contiennent le mot donné.

Exemple : Vérifier le mot «vérifier», je le 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'un truc avec findet xargssuffirait ici, mais pas sûr.

Des idées?

mtk
la source

Réponses:

39

Utilisez l' option -lou --files-with-matchesqui 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. ( -lest spécifié par POSIX.)

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

$ grep check * -lR
NN
la source
Fonctionne également sur MSYS. Génial!
Kos
2
J'ai utilisé grep -rl "text to find" "/usr/share"et cela a très bien fonctionné!
Shrout1
18
find . -type f -exec grep -l check {} +

Vous ne voudrez probablement pas utiliser l' -Roption qui avec les versions modernes de GNU grepsuit les liens symboliques lors de la descente des répertoires. Utilisez -rplutôt l' option qui, depuis la version 2.12 (avril 2012), ne suit plus les liens symboliques.

Si votre grep n'est pas celui de GNU, ou est plus ancien que la version 2.12, ou si vous avez besoin que votre code soit portable sur des systèmes GNU non-saignants, utilisez la findcommande ci-dessus.

Sinon, vous pouvez faire:

grep -rl check .

Ne pas utiliser *(car cela omettrait les fichiers cachés dans le répertoire actuel (et dans le répertoire actuel uniquement) et causerait des problèmes pour les fichiers dont le nom commence par a -), évitez de passer des options après des arguments car cela ne garantit pas de fonctionner selon le environnement et n'est pas portable.

Stéphane Chazelas
la source
1

Essaye ça:

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

Quant aux grepdrapeaux ...

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

-vprendra la sortie de la première greprecherche, filtrera les fichiers avec des résultats nuls et imprimera uniquement les fichiers avec des résultats non nuls.

Brightwellcd
la source
Cela obtiendra un faux négatif si vous avez des fichiers (ou des directeurs) dont les noms contiennent :0. C'est mieux grep -v ':0$'. Même cela étouffera les chemins d'accès qui contiennent des sauts de ligne.
Scott
0

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.

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

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

Maniraja Jorige
la source
0

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

par exemple, grep -lR "NAVIGATE" .où nous trouvons le mot NAVIGATEdans le .répertoire courant.

imsrgadich
la source
-2
 grep -rli trim \` find . -name *.q \` 

Donnez-vous la liste des .qfichiers contient le mot-clétrim

Mithun
la source