113 votes

Recherche des fichiers qui contiennent une certaine chaîne de caractères à l'aide de find (1) et grep (1)

find . -type f -print -exec cat {} \; | grep some string

La commande ci-dessus n'imprime pas le chemin du fichier.

Je l'utilise : Ubuntu, bash 4 .

154voto

niceperson Points 21

J'utilise

grep "some string" . -R

et il fonctionne plus rapidement

p.s.

Cas d'utilisation plus complexe

grep -HiRE "some string|other string" . #H for file printing, i for case-insensitive, R for recursive search, E for regex 

Pour lire l'explication du paramètre i

grep --help | grep -- -i

120voto

Abbas Points 3737

C'est parce que vous nourrissez grep un flux de texte qui se trouve contenir des noms de fichiers. Puisque vous n'avez fourni aucun nom de fichier comme argument à grep, on ne peut pas s'attendre à ce qu'il déduise de quel fichier provient une ligne correspondante. Utilisez xargs :

find . -type f -print | xargs grep "some string"

Puisque vous avez GNU find/xargs, c'est une manière plus sûre pour xargs de lire les noms de fichiers :

find . -type f -print0 | xargs -0 grep "some string"

Si vous voulez seulement les noms de fichiers qui ont une ligne correspondante sans montrer la ligne correspondante :

find . -type f -print0 | xargs -0 grep -l "some string"

20voto

Pitto Points 1816

Je recherche souvent le code source dans des structures de dossiers complexes et je trouve utile d'utiliser :

cd /your/folder/
grep -rHino "your string"

Avec ces paramètres, sans utiliser find j'obtiens le chemin complet du fichier et le numéro de ligne qui contient le chaîne spécifiée .

Il est également facile à retenir car il BASH es à travers votre recherche comme un rHino :)

Je vais vous montrer comment cela fonctionne à l'aide d'un exemple rapide.

Affichons le contenu d'un fichier à l'aide de cat :

jeeves ~ # cat fw.stop
#!/bin/sh
echo "Stopping firewall and allowing everyone..."
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

Et recherchons récursivement tous les fichiers contenant la chaîne "iptables -P" :

jeeves ~ # grep -rinHo "iptables -P"
fw.stop:9:iptables -P
fw.stop:10:iptables -P
fw.stop:11:iptables -P

Comme vous pouvez le voir dans le résultat, nous avons nom de fichier:rangée d'occurrences:chaîne recherchée

Voici une description plus détaillée des paramètres utilisés :

-r Pour chaque opérande de répertoire, lire et traiter tous les fichiers de ce répertoire, de manière récursive. Suivez les liens symboliques sur la ligne de commande, mais ignorez les liens symboliques qui sont rencontrés récursivement. Notez que si aucun fichier n'est donnée, grep recherche dans le répertoire de travail. C'est la identique à l'option '--directories=recurse'.

-i Ignorer le cas.

-n Préfixe chaque ligne de sortie avec le numéro de ligne basé sur 1 dans son fichier d'entrée. (-n est spécifié par POSIX).

-H Imprimez le nom du fichier pour chaque correspondance. C'est la valeur par défaut lorsqu'il y a plus d'un fichier à rechercher.

-o Imprimer seulement les parties correspondantes (non vides) des lignes correspondantes, avec chacune de ces parties sur une ligne de sortie séparée. Les lignes de sortie utilisent les mêmes délimiteurs que ceux utilisés en entrée, et les délimiteurs sont des octets nuls si -z (--null-data) est également utilisé (voir Autres options).

2voto

user515185 Points 21

Je préférais

| trouver le fichier |make grep ont finding file | show de full path of the file

find / -type f -exec grep 'some string' {} \ ; -exec echo {} \ ;

0voto

qoomon Points 230

Chercheur d'argent est un utilitaire très rapide et pratique pour rechercher des fichiers et du contenu.

Pour résoudre votre problème, la commande silver searcher ressemblerait à ceci...

ag 'some string' -l

-l N'imprimez que les noms de fichiers qui contiennent des correspondances (n'imprimez pas les lignes correspondantes).

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X