Question Comment puis-je trouver tous les fichiers contenant un texte spécifique sur Linux?


J'essaie de trouver un moyen de scanner tout mon système Linux pour 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.

Quand je regardais comment faire, je suis tombé sur cette solution deux fois:

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

Cependant, cela ne fonctionne pas. Il semble afficher chaque fichier dans le système.

Est-ce proche de la bonne façon de le faire? Si non, comment le ferais-je? Cette capacité à trouver des chaînes de texte dans les fichiers serait extraordinairement utile pour certains projets de programmation que je fais.


3677
2018-06-06 08:06


origine


Réponses:


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 correspondre le mot entier.
  • -l (L minuscule) peut être ajouté pour donner juste le nom de fichier des fichiers correspondants.

Avec ceux-ci, --exclude, --include, --exclude-dir Les drapeaux pourraient être utilisés pour une recherche efficace:

  • Cela ne recherchera que dans les fichiers portant l'extension .c ou .h:

    grep --include=\*.{c,h} -rnw '/path/to/somewhere/' -e "pattern"
    
  • Cela exclura la recherche de 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 (des) répertoire (s) particulier --exclude-dir paramètre. Par exemple, ceci exclura les répertoires dir1 /, dir2 / et tous ceux qui correspondent * .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 but que le vôtre.

Pour plus d'options vérifier man grep.


6648
2018-06-06 08:21



Vous pouvez utiliser grep -ilR:

grep -Ril "text-to-find-here" /
  • i signifie ignorer le cas (facultatif dans votre cas).
  • R signifie récursif.
  • l signifie "montrer le nom du fichier, pas le résultat lui-même".
  • / signifie démarrer à la racine de votre machine.

1085
2018-06-06 08:08



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

Faites juste:

ack 'text-to-find-here'

Dans votre répertoire racine

Vous pouvez aussi utiliser expressions régulières, spécifiez le type de fichier, etc.


METTRE À JOUR

Je viens de découvrir Le chercheur d'argent, qui est comme ack mais 3-5x plus vite que cela et ignore même les modèles d'un .gitignore fichier.


232
2018-06-06 08:26



Vous pouvez utiliser:

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

le r signifie récursif et donc va chercher dans le chemin spécifié et aussi ses sous-répertoires. Cela vous dira le nom du fichier ainsi que d'imprimer la ligne dans le fichier où la chaîne apparaît.

Ou une commande similaire à celle que vous essayez (exemple:) de 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 il n'imprime pas le nom du fichier.

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


125
2018-03-14 23:29



Vous pouvez utiliser ceci:

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

83
2017-07-31 13:44



Liste des noms de fichiers contenant un texte donné

Tout d'abord, je crois que vous avez utilisé -H au lieu de -l. Aussi, vous pouvez essayer d'ajouter le texte entre guillemets suivi par {} \.

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 quelque peu similaires à 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é à l'affaire comme "texte" vs "TEXT", vous pouvez utiliser le -i passer à ignorer le cas. Vous pouvez lire plus de détails ici.

J'espère que cela vous aide.


48
2017-11-09 13:18



Si ton grep ne supporte pas 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 pour find -exec.

Cela affichera le nom de fichier et le contenu de la ligne correspondante, par ex.

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

Indicateurs facultatifs que vous pouvez ajouter à grep:

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

46
2018-06-20 08:49



grep -insr "pattern" *
  • i: Ignorez les distinctions de cas dans les fichiers PATTERN et les fichiers d'entrée.
  • n: Préfixe 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 sur les fichiers inexistants ou illisibles.
  • r: Lit tous les fichiers sous chaque répertoire, récursivement.

34
2018-02-26 05:47



grep (GNOU ou BSD)

Vous pouvez utiliser grep outil pour rechercher récursivement le dossier actuel, comme:

grep -r "class foo" .

Remarque: -r - Recherche récursive des sous-répertoires.

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

grep "class foo" **/*.c

Note: En utilisant option de globbing (**), il scanne tous les fichiers récursivement 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 caché 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 syntaxe à la place comme:

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

Alternativement utiliser ripgrep.

ripgrep

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

rg "class foo" .

Vérifiez les documents, les étapes d'installation ou le code source sur le Page du projet GitHub.

C'est beaucoup plus rapide que n'importe quel autre outil GNOU/BSD  grep, ucg, ag, sift, ack, pt ou similaire, car il est construit sur le dessus de Le moteur de regex de Rust qui utilise des automates finis, SIMD et des optimisations littérales agressives pour accélérer la recherche.

Il prend en charge les modèles ignorés spécifiés dans .gitignore fichiers, de sorte qu'un chemin de fichier unique peut être comparé à plusieurs modèles de glob simultanément.


Vous pouvez utiliser les paramètres communs tels que:

  • -i - Recherche insensible.
  • -I - Ignorer les fichiers binaires.
  • -w - Rechercher les mots entiers (en opposition de correspondance partielle des mots).
  • -n - Montre la ligne de ton match.
  • -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 de fichier où le texte est trouvé.
  • -c - Affiche le nombre de lignes correspondantes. Peut être combiné avec -H.

29
2018-05-09 10:11