grep chercher - Comment trouver tous les fichiers contenant du texte spécifique sur Linux?




xargs plusieurs (25)

J'espère que c'est utile ...

Développer un peu le grep pour donner plus d'informations dans la sortie, par exemple, pour obtenir le numéro de ligne dans le fichier contenant le texte, procédez comme suit:

find . -type f -name "*.*" -print0 | xargs --null grep --with-filename --line-number --no-messages --color --ignore-case "searthtext"

Et si vous avez une idée du type de fichier, vous pouvez affiner votre recherche en spécifiant les extensions de type de fichier à rechercher, dans ce cas- .pas fichiers .pas OU .dfm :

find . -type f \( -name "*.pas" -o -name "*.dfm" \) -print0 | xargs --null grep --with-filename --line-number --no-messages --color --ignore-case "searchtext"

Brève explication des options:

  1. . dans la find spécifie à partir du répertoire en cours.
  2. -name " *.* ": pour tous les fichiers (-name " *.pas " -o -name " *.dfm "): seuls les *.pas OU *.dfm , OU spécifiés avec -o
  3. -type f indique que vous recherchez des fichiers
  4. -print0 et --null de l'autre côté du | (pipe) sont les plus cruciales, passant le nom de fichier de la find à grep incorporé dans les xargs , permettant ainsi de transmettre les noms de fichiers avec des espaces dans les noms de fichiers, permettant à grep de traiter le chemin et le nom de fichier comme une seule chaîne, sans les casser. sur chaque espace.

J'essaie de trouver un moyen d'analyser l'ensemble de mon système Linux pour rechercher tous les fichiers contenant une chaîne de texte spécifique. Juste pour clarifier, je cherche du texte dans le fichier, pas dans le nom du fichier.

Lorsque je cherchais comment faire cela, je suis tombé sur cette solution à deux reprises:

find / -type f -exec grep -H 'text-to-find-here' {} \;

Cependant, ça ne marche pas. Il semble afficher chaque fichier du système.

Est-ce proche de la bonne façon de le faire? Si non, comment devrais-je? Cette capacité à rechercher des chaînes de texte dans des fichiers serait extrêmement utile pour certains projets de programmation que je réalise.


Une simple find peut être pratique. alias dans votre fichier ~/.bashrc :

alias ffind find / -type f | xargs grep

Démarrer un nouveau terminal et émettre:

ffind 'text-to-find-here'

J'ai écrit un script Python qui fait quelque chose de similaire. Voici comment utiliser ce script.

./sniff.py path pattern_to_search [file_pattern]

Le premier argument, path , est le répertoire dans lequel nous effectuerons une recherche récursive. Le deuxième argument, pattern_to_search , est une expression régulière que nous souhaitons rechercher dans un fichier. Nous utilisons le format d'expression régulière défini dans la bibliothèque Python re . Dans ce script, le . correspond également à la nouvelle ligne.

Le troisième argument, file_pattern , est optionnel. Ceci est une autre expression régulière qui fonctionne sur un nom de fichier. Seuls les fichiers correspondant à cette expression régulière seront pris en compte.

Par exemple, si je veux rechercher des fichiers Python avec l’extension py contenant Pool( suivis du mot Adaptor , je fais ce qui suit,

./sniff.py . "Pool(.*?Adaptor"  .*py
./Demos/snippets/cubeMeshSigNeur.py:146 
./Demos/snippets/testSigNeur.py:259 
./python/moose/multiscale/core/mumbl.py:206 
./Demos/snippets/multiComptSigNeur.py:268 

Et voila, il génère le chemin des fichiers correspondants et le numéro de la ligne à laquelle la correspondance a été trouvée. Si plusieurs correspondances ont été trouvées, chaque numéro de ligne sera ajouté au nom du fichier.


Comment trouver tous les fichiers contenant du texte spécifique sur Linux? (...)

Je suis tombé sur cette solution deux fois:

find / -type f -exec grep -H 'text-to-find-here' {} \;

Si vous utilisez find comme dans votre exemple, ajoutez plutôt -s ( --no-messages ) à grep , et 2>/dev/null à la fin de la commande pour éviter de nombreux messages d' autorisation refusés émis par grep et find :

grep -RIl "" .

find est l'outil standard de recherche de fichiers, associé à grep lorsque vous recherchez un texte spécifique, sur des plates-formes de type Unix. La commande find est souvent combinée avec xargs , d'ailleurs.

Des outils plus rapides et plus simples existent dans le même but - voir ci-dessous. Mieux vaut les essayer, à condition qu'elles soient disponibles sur votre plate - forme , bien sûr:

Des alternatives plus rapides et plus faciles

ripgrep - l'outil de recherche le plus rapide autour de:

find / -type f -exec grep -sH 'text-to-find-here' {} \; 2>/dev/null

Le chercheur d'argent :

rg 'text-to-find-here' / -l

ack :

ag 'text-to-find-here' / -l

Remarque: Vous pouvez également ajouter 2>/dev/null à ces commandes pour masquer de nombreux messages d'erreur.

Attention : à moins que vous ne puissiez vraiment pas l'éviter, ne cherchez pas dans '/' (le répertoire racine) pour éviter une recherche longue et inefficace! Ainsi, dans les exemples ci-dessus, vous feriez mieux de remplacer " / " par un nom de sous-répertoire, par exemple "/ home", selon l'endroit où vous souhaitez effectuer la recherche ...


Vous pouvez utiliser ack . C'est comme grep pour le code source. Vous pouvez analyser tout votre système de fichiers avec.

Il suffit de faire:

ack 'text-to-find-here'

Dans votre répertoire racine.

Vous pouvez également utiliser des expressions régulières , spécifier le type de fichier, etc.

METTRE À JOUR

Je viens de découvrir The Silver Searcher , qui ressemble à ack mais 3 à 5 fois plus rapide et ignore même les motifs d'un fichier .gitignore .


Voici la liste de plusieurs commandes pouvant être utilisées pour rechercher un fichier.

grep "text string to search” directory-path

grep [option] "text string to search” directory-path

grep -r "text string to search” directory-path

grep -r -H "text string to search” directory-path

egrep -R "word-1|word-2” directory-path

egrep -w -R "word-1|word-2” directory-path

Liste des noms de fichiers contenant un texte donné

Tout d’abord, je pense que vous avez utilisé -H au lieu de -l . Vous pouvez également essayer d’ajouter le texte entre guillemets suivi de {} \ .

find / -type f -exec grep -l "text-to-find-here" {} \; 

Exemple

Supposons que vous recherchiez des fichiers contenant du texte spécifique "Licence Apache" dans votre répertoire. Il affichera des résultats similaires à ceux présentés ci-dessous (la sortie sera différente en fonction du contenu de votre répertoire).

bash-4.1$ find . -type f -exec grep -l "Apache License" {} \; 
./net/java/jvnet-parent/5/jvnet-parent-5.pom
./commons-cli/commons-cli/1.3.1/commons-cli-1.3.1.pom
./io/swagger/swagger-project/1.5.10/swagger-project-1.5.10.pom
./io/netty/netty-transport/4.1.7.Final/netty-transport-4.1.7.Final.pom
./commons-codec/commons-codec/1.9/commons-codec-1.9.pom
./commons-io/commons-io/2.4/commons-io-2.4.pom
bash-4.1$ 

Supprimer la sensibilité à la casse

Même si vous n'êtes pas habitué à la casse comme "texte" ou "TEXT", vous pouvez utiliser le commutateur -i pour ignorer la casse. Vous pouvez lire plus de détails here .

J'espère que cela vous aide.


Essayer:

find . -name "*.txt" | xargs grep -i "text_pattern"

grep peut être utilisé même si nous ne cherchons pas de chaîne.

Simplement en cours d'exécution,

ack 'text-to-find-here' / -l

affichera le chemin de tous les fichiers texte, c’est-à-dire ceux qui ne contiennent que des caractères imprimables.


Vous pouvez utiliser:

grep -r "string to be searched"  /path/to/dir

Le r correspond à récursif et va donc rechercher dans le chemin spécifié ainsi que dans ses sous-répertoires. Cela vous indiquera le nom du fichier et imprimera la ligne dans le fichier où la chaîne apparaît.

Ou une commande similaire à celle que vous essayez (exemple:) pour rechercher dans tous les fichiers javascript (* .js):

find . -name '*.js' -exec grep -i 'string to search for' {} \; -print

Cela imprimera les lignes dans les fichiers où le texte apparaît, mais n'imprimera pas le nom du fichier.

En plus de cette commande, nous pouvons également écrire ceci: grep -rn "Chaîne de recherche" / chemin / vers / répertoire / ou / fichier -r: recherche récursive n: le numéro de ligne sera affiché pour les correspondances


Faites ce qui suit:

grep -rnw '/path/to/somewhere/' -e 'pattern'
  • -r ou -R est récursif,
  • -n est le numéro de ligne et
  • -w signifie faire correspondre le mot entier.
  • -l (L minuscule) peut être ajouté pour simplement donner le nom du fichier correspondant.

En plus de ceux-ci, les --exclude , --include , --exclude-dir pourraient être utilisés pour une recherche efficace:

  • Cela recherchera uniquement dans les fichiers portant les extensions .c ou .h:

    grep --include=\*.{c,h} -rnw '/path/to/somewhere/' -e "pattern"
    
  • Cela exclura la recherche dans tous les fichiers se terminant par l'extension .o:

    grep --exclude=*.o -rnw '/path/to/somewhere/' -e "pattern"
    
  • Pour les répertoires, il est possible d'exclure un ou des répertoires particuliers via le paramètre --exclude-dir . Par exemple, cela exclura les répertoires dir1 /, dir2 / et tous ceux-ci correspondant à * .dst /:

    grep --exclude-dir={dir1,dir2,*.dst} -rnw '/path/to/somewhere/' -e "pattern"
    

Cela fonctionne très bien pour moi, pour atteindre presque le même objectif que le vôtre.

Pour plus d'options, vérifiez man grep .


Évitez les tracas et installez ack-grep. Cela élimine beaucoup de problèmes de permission et de citation.

apt-get install ack-grep

Ensuite, allez dans le répertoire que vous souhaitez rechercher et exécutez la commande ci-dessous

cd /
ack-grep "find my keyword"

grep -insr "pattern" *
  • i : Ignore les distinctions de casse dans les fichiers PATTERN et d'entrée.
  • n : préfixez chaque ligne de sortie avec le numéro de ligne basé sur 1 dans son fichier d'entrée.
  • s : supprime les messages d'erreur concernant les fichiers inexistants ou illisibles.
  • r : lit tous les fichiers de chaque répertoire de manière récursive.

Essaye ça:

find . | xargs grep 'word' -sl

Utilisation:

grep -c Your_Pattern *

Cela indiquera le nombre de copies de votre modèle dans chacun des fichiers du répertoire actuel.


Je suis fasciné par la facilité avec laquelle grep le fait avec 'rl'

grep -rl 'pattern_to_find' /path/where/to/find

-r to find recursively file / directory inside directories..
-l to list files matching the 'pattern'

Utilisez '-r' sans 'l' pour voir les noms de fichiers suivis du texte dans lequel se trouve le motif !

grep -r 'pattern_to_find' /path/where/to/find

Fonctionne tout simplement parfait ..

J'espère que ça aide!


Si votre grep ne prend pas en charge la recherche récursive, vous pouvez combiner find avec xargs :

find / -type f | xargs grep 'text-to-find-here'

Je trouve cela plus facile à retenir que le format de find -exec .

Ceci affichera le nom du fichier et le contenu de la ligne correspondante, par exemple

/home/rob/file:text-to-find-here

Drapeaux facultatifs que vous voudrez peut-être ajouter à grep :

  • -i - recherche insensible à la casse
  • -l - ne sort que le nom du fichier où la correspondance a été trouvée
  • -h - -h uniquement la ligne qui correspond (pas le nom du fichier)

La commande ci-dessous fonctionnera correctement pour cette approche:

find ./ -name "file_pattern_name"  -exec grep -r "pattern" {} \;

Il y a un nouvel utilitaire appelé The Silversearcher

sudo apt install silversearcher-ag

Il travaille en étroite collaboration avec Git et d’autres VCS. Donc, vous n'obtiendrez rien dans un .git ou un autre répertoire.

Vous pouvez simplement utiliser

ag -ia "Search query"

Et cela fera le travail pour vous!


Vous pouvez utiliser ceci:

grep -inr "Text" folder/to/be/searched/

Toutes les réponses précédentes suggèrent grep et find. Mais il y a un autre moyen: utiliser le commandant de minuit

C'est un utilitaire gratuit (30 ans, prouvé par le temps) qui est visuel sans être une interface graphique. A des tonnes de fonctions, la recherche de fichiers n’est que l’une d’elles.


Vous pouvez utiliser grep -ilR :

grep -Ril "text-to-find-here" /
  • i représente Ignorer le cas (facultatif dans votre cas).
  • R signifie récursif.
  • l signifie "affiche le nom du fichier, pas le résultat lui-même".
  • / signifie que vous commencez à la racine de votre machine.

Il existe un ackoutil qui ferait exactement ce que vous recherchez.

http://linux.die.net/man/1/ack

ack -i search_string folder_path/*

Vous pouvez ignorer -ipour la recherche sensible à la casse


grep ( GNU ou BSD )

Vous pouvez utiliser l'outil grep pour rechercher de manière récursive le dossier actuel, par exemple:

grep -r "class foo" .

Remarque: -r - Effectuez une recherche récursive dans les sous-répertoires.

Vous pouvez également utiliser la syntaxe de globbing pour effectuer une recherche dans des fichiers spécifiques tels que:

grep "class foo" **/*.c

Remarque: En utilisant l' option globbing ( ** ), 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 estimez que votre argument est trop long, envisagez de réduire votre recherche ou utilisez la syntaxe de recherche, telle que:

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

Sinon, utilisez ripgrep .

ripgrep

Si vous travaillez sur des projets plus volumineux ou de gros fichiers, vous devriez plutôt utiliser ripgrep , comme:

rg "class foo" .

Consultez la documentation, les étapes d'installation ou le code source sur la ripgrep .

Il est beaucoup plus rapide que n'importe quel autre outil comme GNU / BSD grep , ucg , ag , ucg , ack , pt ou similaire, puisqu'il est construit sur le moteur de 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 .gitignore spécifiés dans les fichiers .gitignore , de sorte qu'un même chemin de fichier peut être comparé à plusieurs modèles 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 (par opposition à la correspondance partielle des mots).
  • -n - Affiche la ligne de votre match.
  • -C / --context (par exemple -C5 ) - Augmente le contexte pour que vous voyiez le code qui l'entoure.
  • --color=auto - Marque 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 .

Sur CentOS 6.6 / Grep 2.6.3, je dois l'utiliser comme ceci:

grep "term" -Hnir --include \*.php --exclude-dir "*excluded_dir*"

Notez l'absence de signes égaux "=" (sinon --include , --exclude , include-dir et --exclude-dir sont ignorés)





linux text grep directory find