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




trouver un repertoire linux (20)

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 ...

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.


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.


Essaye ça:

find . | xargs grep 'word' -sl

Essayer:

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

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 .


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!


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.

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)

Utilisez pwd pour rechercher à partir de n'importe quel répertoire dans lequel vous vous trouvez, récursif vers le bas

grep -rnw `pwd` -e "pattern"

Mise à jour Selon la version de grep que vous utilisez, vous pouvez omettre pwd . Sur les nouvelles versions . semble être le cas par défaut pour grep si aucun répertoire n’est donné ainsi:

grep -rnw -e "pattern"

ou

grep -rnw "pattern"

fera la même chose que ci-dessus!


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

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.

Vous pouvez utiliser ceci:

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

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.


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!


Pour rechercher la chaîne et afficher uniquement cette ligne avec la chaîne de recherche:

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 de 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;


grep est votre bon ami pour y parvenir.

grep -r <text_fo_find> <directory>

si vous ne vous souciez pas de la casse du texte à trouver, utilisez

grep -ir <text_to_find> <directory>

É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"

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.


find /path -type f -exec grep -l "string" {} \;

Explication des commentaires

find est une commande qui vous permet de rechercher des fichiers et d'autres objets, tels que des répertoires et des liens, dans les sous-répertoires d'un chemin donné. Si vous ne spécifiez pas de masque que les noms de fichiers doivent rencontrer, il énumère tous les objets de répertoire.

-type f specifies that it should proceed only files, not directories etc.
-exec grep specifies that for every found file, it should run grep command, passing its filename as an argument to it, by replacing {} with the filename






find