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"