web-dev-qa-db-fra.com

Recherche de fichiers contenant une certaine chaîne à l'aide de find (1) et de grep (1)

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

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

J'utilise: Ubuntu, bash 4.

59
H.Rabiee

C'est parce que vous alimentez grep un flux de texte qui contient des noms de fichiers. Puisque vous n’avez fourni aucun nom de fichier en tant qu’argument à grep, vous ne pouvez pas en déduire 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 un moyen plus sûr pour xargs de lire les noms de fichiers:

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

Si vous ne souhaitez que les noms de fichiers qui ont une ligne de correspondance sans montrer la ligne correspondante:

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

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 param i

grep --help | grep -- -i
97
ArcherGodson

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 parce queBASHes lors de votre recherche, comme un rHino :)

Je vais montrer comment cela fonctionne avec un exemple rapide.

Affiche le contenu d'un fichier en utilisant 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 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 le résultat, nous avons nom du fichier: ligne de frappe: chaîne recherchée

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

-r Pour chaque opérande de répertoire, lisez et traitez 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 rencontrés de manière récursive. Notez que si aucun opérande de fichier n’est donné, grep cherche dans le répertoire de travail. C’est la même chose que l’option ‘--directories = recurse’.

-i Affiche 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éfixez 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 Affiche le nom du fichier pour chaque correspondance. C'est la valeur par défaut lorsqu'il y a plus d'un fichier à rechercher.

-o N'imprimez que les parties correspondantes (non vides) des lignes correspondantes, chacune de ces parties se trouvant sur une ligne de sortie distincte. Les lignes de sortie utilisent les mêmes délimiteurs comme entrée et les délimiteurs sont des octets nuls si -z (--null-data) est également utilisé (voir Autres options).

10
Pitto

J'ai preferé

| trouver le fichier | make grep ont trouver le fichier | affiche le chemin complet du fichier

find/-type f -exec grep 'une chaîne' {} \; -exec echo {} \;

1
user515185

Silver Searcher est un util 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 contenant des correspondances (n'imprimez pas les lignes correspondantes)

0
qoomon