GNU/Linux >> Tutoriels Linux >  >> Linux

Recherche d'un certain nombre de fichiers pour une chaîne dans Linux

Solution 1 :

Vous pouvez utiliser grep :

grep -rn 'classname' /path/to/source

Cela imprimera également le numéro de ligne à côté de chaque correspondance.

Insensible à la casse :

grep -rin 'classname' /path/to/source

Recherche non récursive dans tous les fichiers cpp :

grep -n 'classname' /path/to/source/*.cpp

Solution 2 :

Toutes les réponses ci-dessus fonctionneront parfaitement bien, mais peuvent provoquer des faux positifs si vous avez la chaîne dans plus que le code source. Supposons que vous recherchiez où vous utilisez la classe FooBar dans un projet Java, vous pouvez rechercher tous les fichiers nommés *.java et grep uniquement ceux-ci.

# grep "FooBar" -Hn $(find -name "*.java")

La section entre $() s'étendra à la sortie de cette commande. Le -H imprime le nom du fichier. C'est la valeur par défaut lorsqu'il y a plus d'un nom de fichier, mais nous l'ajoutons explicitement ici au cas où l'extension ne renvoie qu'un seul nom de fichier. Le -n imprime le numéro de ligne de la correspondance.

Cela fonctionnera pour les petits projets, mais si vous avez affaire à un projet plus important, il est possible que la recherche s'étende à une chaîne plus longue que la limite de la ligne de commande. Il est donc plus sûr d'utiliser :

# find -name "*.java" -print0 | xargs -0 grep "FooBar" -Hn 

xargs prendra l'entrée de standard in et la divisera pour qu'elle tienne sur la ligne de commande, en exécutant la commande plusieurs fois si nécessaire. Les -print0 et -0 sont nécessaires pour traiter les fichiers avec des espaces dans leur nom.

Vous pouvez également rechercher tous les noms de fichiers avec une correspondance en utilisant :

# find -name "*.java" -print0 | xargs -0 grep "FooBar" -l

Le -l affichera simplement le nom du fichier et arrêtera de chercher dans un fichier particulier dès qu'il trouvera une correspondance.

Si vous allez faire ce genre de choses fréquemment, vous voudrez peut-être regarder un outil comme les ctags ou les balises exubérantes, qui maintiennent un index de recherche de votre code source et peuvent répondre rapidement à ce genre de questions. vim et emacs prennent en charge ces outils. Vous pouvez également regarder un IDE comme eclipse, qui peut très bien faire des références croisées.

(Je sais que vous cherchiez une définition de classe, mais en Java, une classe sera définie dans un fichier portant le même nom que la classe. Si vous faisiez cpp, vous pourriez faire quelque chose comme :

# find -name "*.cpp" -o -name "*.cc" -o -name "*.h" -o -name "*.hpp" -print0 | \
  xargs -0 egrep "class\s+FooBar" -Hn 

Solution 3 :

Pour la recherche dans le code source, j'ai trouvé que ack (betterthangrep.com) est, pour citer le marketing, meilleur que grep. Sa sortie est plus facile à lire et il fera beaucoup de choses automatiquement, comme ignorer les fichiers de code non source :répertoires VCS (par exemple CVS et .svn), fichiers de sauvegarde.

Solution 4 :

ack est meilleur pour rechercher les codes sources car il reconnaît déjà certaines des extensions de fichiers les plus populaires (c, perl, etc.). Il est aussi rapide que grep et ignore par défaut tous vos artefacts de contrôle de version. Par exemple, si vous souhaitez rechercher un modèle de code source perl, vous pouvez utiliser

ack --perl pattern

au lieu de

grep pattern $(find . -name '*.pl' -or -name '*.pm' -or -name '*.pod' | grep -v .svn)

Linux
  1. Comment augmenter la limite du nombre de fichiers ouverts sous Linux

  2. Nombre de fichiers contenant une chaîne donnée ?

  3. Nombre maximum de fichiers/répertoires sous Linux ?

  4. Recherche d'une chaîne dans plusieurs fichiers sous Linux

  5. Exclure les fichiers cachés lors de la recherche avec Unix/Linux find ?

Comment copier un grand nombre de fichiers sous Linux

Linux recherche une chaîne dans des dossiers et des fichiers avec ack

Rechercher du texte dans des fichiers sous Linux à l'aide de grep

Compter le nombre de fichiers dans un répertoire sous Linux

Comment compter le nombre de fichiers dans un répertoire sous Linux

Dropbox configuré pour un serveur cloud Linux