2013-07-02 09:24:45 +0000 2013-07-02 09:24:45 +0000
83
83

Recherche de fichiers contenant 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 d'accès au fichier.

J'utilise : Ubuntu, bash 4.

Réponses (5)

117
117
117
2013-07-02 12:01:16 +0000

J'utilise

grep "some string" . -R

et ça marche plus vite

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 i

grep --help | grep -- -i
98
98
98
2013-07-02 10:02:41 +0000

C'est parce que vous alimentez grep un flux de texte qui se trouve contenir des noms de fichiers. Comme vous n'avez pas fourni de noms de fichiers comme arguments au 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 façon 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"
14
14
14
2014-09-26 13:24:22 +0000

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

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 la chaîne spécifiée.

Il est également facile à retenir car il BASHes par votre recherche comme un rHino :)

Je vais vous montrer comment cela fonctionne avec un exemple rapide.

Affichons le contenu d'un fichier en utilisant le chat :

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 cherchons 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 la sortie, nous avons filename:hit row:searched string

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 opérande de fichier n'est donné, grep recherche dans le répertoire de travail. C'est la même chose que l'option ‘–directories=recurse’.

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

-n Préfixer 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 Imprimez uniquement les parties correspondantes (non vides) des lignes de correspondance, chacune de ces parties se trouvant sur une ligne de sortie distincte. Les lignes de sortie utilisent les mêmes délimiteurs qu'en entrée, et les délimiteurs sont des octets nuls si -z (–null-data) est également utilisé (voir Autres options).

2
2
2
2015-10-28 19:03:56 +0000

Je préférais

| find the file |make grep ont finding file | show de full path of the file

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

0
0
0
2018-10-22 16:15:38 +0000

Silver Searcher 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)