448 votes

Comment utiliser la commande "grep" pour trouver du texte, y compris des sous-répertoires ?

Je veux trouver tous les fichiers qui contiennent une chaîne de texte spécifique. Le site grep fonctionne, mais je ne sais pas comment l'utiliser pour chaque répertoire (je ne peux le faire que pour mon répertoire courant). J'ai essayé de lire man grep mais cela n'a rien donné.

4voto

mnono Points 41

La commande rgrep est dédiée à un tel besoin

S'il n'est pas disponible, vous pouvez l'obtenir comme suit

mkdir -p ~/bin
cd ~/bin
wget http://sdjf.esmartdesign.com/files/rgrep
chmod +x rgrep

Vous pouvez directement définir dans vos options grep par défaut comme décrit ci-dessus.

J'utilise personnellement

[[  ${#args} -lt 5 && "${args//[[:space:]]/}" == "-i" ]] && args="-Hin"
args="${args:--Hns} --color=auto"

Sujet connexe : comment toujours utiliser rgrep avec la couleur

0 votes

Rgrep est fourni par le paquet grep qui est installé par défaut dans Ubuntu.

2voto

precise Points 14840

Mise à jour 2 :

Cette ligne de commandes utilisant find y grep corrige le problème :

$ find path_to_search_in -type f -exec grep -in searchString {} 2> /dev/null +

--color=<always or auto> pour une sortie colorée :

$ find path_to_search_in -type f \
            -exec grep --color=always -in searchString {} 2>/dev/null +

Ejemplo:

$ find /tmp/test/ -type f -exec grep --color=auto -in "Search string" {} 2>/dev/null +

Un exemple est présenté dans l'image ci-dessous : snap1


Mise à jour 1 :

Vous pouvez essayer le code suivant ; comme une fonction dans votre .bashrc ou .bash_aliases ou dans un script :

wherein () 
{ 
    for i in $(find "$1" -type f 2> /dev/null);
    do
        if grep --color=auto -i "$2" "$i" 2> /dev/null; then
            echo -e "\033[0;32mFound in: $i \033[0m\n";
        fi;
    done
}

Utilisation : wherein /path/to/search/in/ searchkeyword

exemple :

$ wherein ~/Documents/ "hello world"

(Note : Comme suggéré dans les commentaires ci-dessous par @enzotib, cela ne fonctionne pas avec les fichiers/répertoires incluant des espaces dans leurs noms).


Poste original

Pour rechercher la chaîne de caractères et sortir uniquement la ligne contenant la chaîne de caractères recherchée :

$ for i in $(find /path/of/target/directory -type f); do \
    grep -i "the string to look for" "$i"; done

Par exemple :

$ for i in $(find /usr/share/applications -type f); \
    do grep -i "web browser" "$i"; done

Pour afficher le nom du fichier contenant la chaîne de recherche :

$ for i in $(find /path/of/target/directory -type f); do \
    if grep -i "the string to look for" "$i" > /dev/null; then echo "$i"; fi; done;

Par exemple :

$ for i in $(find /usr/share/applications -type f); \
    do if grep -i "web browser" "$i" > /dev/null; then echo "$i"; \
    fi; done;

0 votes

Échec sur les noms de fichiers contenant des espaces. L'échec est masqué par le fait que stderr n'est pas affiché.

0 votes

@enzotib merci de le signaler c'est toujours non résolu pour la fonction spécifiée J'ai cependant ajouté une autre ligne simple

0 votes

Maintenant la réponse est similaire à celle de @dmityugov.

2voto

kenorb Points 8840

grep ( GNU ou BSD )

Vous pouvez utiliser grep pour rechercher récursivement le dossier courant avec -r paramètre, comme :

grep -r "pattern" .

Nota: -r - Recherche récursive dans les sous-répertoires.

Pour effectuer une recherche dans des fichiers spécifiques, vous pouvez utiliser un filtre de type syntaxe de globbing comme :

grep "class foo" **/*.c

Remarque : En utilisant option de globalisation ( ** ), il analyse tous les fichiers de manière récursive avec une extension ou un motif spécifique. Pour activer cette syntaxe, exécutez : shopt -s globstar . Vous pouvez également utiliser **/*.* pour tous les fichiers (sauf les fichiers cachés et sans extension) ou tout autre motif.

Si vous avez l'erreur que votre argument est trop long, pensez à restreindre votre recherche, ou utilisez find à la place, une syntaxe telle que :

find . -name "*.php" -execdir grep -nH --color=auto foo {} ';'

Vous pouvez également utiliser ripgrep .

ripgrep

Si vous travaillez sur des projets plus importants ou des fichiers volumineux, vous devez utiliser la fonction ripgrep à la place, comme :

rg "pattern" .

Consultez la documentation, les étapes d'installation ou le code source sur le site Web de la Commission européenne. Page du projet sur GitHub .

C'est beaucoup plus rapide que n'importe quel autre outil du type GNU / BSD grep , ucg , ag , sift , ack , pt ou similaire, puisqu'il est construit sur le dessus de Le moteur regex de Rust qui utilise des automates finis, SIMD et des optimisations littérales agressives pour rendre la recherche très rapide.

Il prend en charge les modèles d'ignorance spécifiés dans .gitignore de sorte qu'un seul chemin de fichier peut être comparé à plusieurs motifs globaux simultanément.


Vous pouvez utiliser les paramètres communs tels que :

  • -i - Recherche insensible.
  • -I - Ignorer les fichiers binaires.
  • -w - Recherche des mots entiers (à l'inverse de la correspondance des mots partiels).
  • -n - Montrez la ligne de votre correspondance.
  • -C / --context (par exemple -C5 ) - Augmente le contexte, de sorte que vous voyez le code environnant .
  • --color=auto - Marquez le texte correspondant.
  • -H - Affiche le nom du fichier où se trouve le texte.
  • -c - Affiche le nombre de lignes correspondantes. Peut être combiné avec -H .

1voto

deadprogrammer Points 111

Je fais cela en utilisant xargs, une commande très sous-estimée.

find ./ -type f -print0 | xargs -0 grep 'string_you_are_looking_for'

find ./ vous donne une liste récursive de tous les fichiers dans un dossier courant puis vous l'envoyez à xargs qui exécute la commande grep sur chacun de ces fichiers.

4 votes

Utilisation de xargs sans -print0 option pour find y -0 option pour xargs est déprécié, il échouera sur les noms de fichiers contenant des espaces.

0 votes

@enzotib J'ai édité la réponse comme vous l'avez suggéré - s'il vous plaît examiner et si les besoins d'édition et de correction, je serai heureux de rééditer par vous. merci.

1 votes

@KasiyA : c'est bon maintenant, j'ai enlevé mon downvote.

0voto

Ztyx Points 153

Je sais qu'il y a beaucoup de réponses ici, mais voici une alternative si vous souhaitez ajouter d'autres restrictions lors de la recherche des fichiers :

find . -type f -exec grep --quiet string_to_look_for {} ';' -print

Cela fonctionne parce que grep retournera 0 s'il a trouvé un résultat, 1 sinon. Par exemple, vous pouvez trouver des fichiers de 1 Mo y contenant quelque chose :

find . -type f -exec grep --quiet string_to_look_for {} ';' -size 1M -print

Pour les exigences multiples, vous voudrez probablement utiliser l'indicateur d'optimisation. -O qui existe dans GNU grep.

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