Existe-t-il un moyen plus simple de grep tous les files sous un directory?

Lorsque je veux searchr un contenu entier dans un tree entier, j'utilise

find . -type f -print0 | xargs -0 grep <search_ssortingng> 

Y a-t-il une meilleure façon de le faire en termes de performance ou de brièveté?

Vérifiez si votre grep supporte l'option -r (pour récurse ):

 grep -r <search_ssortingng> . 

Une réponse sous-optimale: Au lieu de canaliser la sortie de find dans grep , vous pourriez juste exécuter

 find . -type f -exec grep 'research' {} '+' 

et voila, une command au lieu de deux!

explication:

 find . -type f 

find tous les files réguliers à l'intérieur.

 -exec grep 'research' 

grep 'search'

 {} 

dans le nom de file trouvé

 '+' 

utilisez une command par tous les noms de files, pas une fois par nom de file.

Nb: avec ';' il aurait été une fois par nom de file.

Sinon, si vous l'utilisez pour traiter le code source, vous pouvez regarder dans ack , qui est fait pour searchr facilement des bits de code.

ack

Modifier :

Vous pouvez étendre cette search un peu. Tout d'abord, vous pouvez utiliser le -name '' de find pour searchr des files avec un model de nommage spécifique.

Par exemple :

  • uniquement les files qui correspondent aux journaux: -name '*.log'

  • uniquement les files qui correspondent aux en-têtes c, mais vous ne pouvez pas restr en majuscules ou en minuscules pour vos extensions de nom de file: -iname *.c

Nb: comme pour grep et ack , le commutateur -i signifie insensible à la casse dans ce cas.

Dans ce cas, grep affichera sans couleur et sans numéro de ligne.

Vous pouvez changer cela avec les --color et -n (colors et numéros de lignes respectivement).

En fin de count, vous pouvez avoir quelque chose comme:

 find . -name '*.log' -type f -exec grep --color -n 'pattern' {} '+' 

par exemple

 $ find . -name '*.c' -type f -exec grep -n 'hello' {} '+' ./test2/target.c:1:hello 

Si vous voulez recycler dans des sous-directorys:

 grep -R 'pattern' . 

L'option -R n'est pas une option standard, mais est prise en charge par les implémentations grep les plus courantes.

Comme indiqué ci-dessus -r ou -R (en fonction de la manipulation de lien symbolique souhaitée) est une option rapide.

Cependant -d <action> peut être utile à certains moments.

La bonne chose à propos de -d est la command skip, qui fait taire le "grep: nom_directory: est un directory" lorsque vous voulez juste numériser le niveau actuel.

 $ grep foo * grep: q2: Is a directory grep: rt: Is a directory $ grep -d skip foo * $ 

et bien sur:

 $ grep -d recurse foo * (list of results that don't exist because the word foo isn't in our source code and I wouldn't publish it anyway). $ 

L'option de -d skip est vraiment pratique dans un autre script, donc vous n'avez pas besoin de 2> /dev/null . 🙂

Si vous traitez beaucoup de files, le grep s'exécute plus rapidement si vous réduisez les files dont il a besoin pour searchr plutôt que de grepper tous les files dans les sous-dossiers.

J'utilise ce format parfois:

 grep "primary" `find . | grep cpp$` 

Trouver tous les files dans les sous-dossiers de . cela se termine en cpp . Puis grep ces files pour "primaire".

Si vous le souhaitez, vous pouvez continuer à canaliser ces résultats dans d'autres appels grep:

 grep "primary" `find . | grep cpp$` | grep -v "ignoreThis" | grep -i "caseInsensitiveGrep"