Question Comment je grep récursivement?


Comment puis-je récursivement grep tous les répertoires et sous-répertoires?

find . | xargs grep "texthere" *

1347
2018-01-01 05:10


origine


Réponses:


grep -r "texthere" .

Le premier paramètre représente l'expression régulière à rechercher, tandis que le second représente le répertoire à rechercher. Dans ce cas, . signifie le répertoire actuel.

Note: Cela fonctionne pour GNU grep, et sur certaines plates-formes comme Solaris, vous devez utiliser spécifiquement GNU grep par opposition à l'implémentation héritée. Pour Solaris, c'est le ggrep commander.


2030
2018-01-01 05:11



Si vous connaissez l'extension ou le modèle du fichier que vous souhaitez, une autre méthode consiste à utiliser --include option:

grep -r --include "*.txt" texthere .

Vous pouvez également mentionner les fichiers à exclure avec --exclude.

Ag

Si vous recherchez fréquemment dans le code, Ag (Le chercheur d'argent) est une alternative beaucoup plus rapide à grep, qui est personnalisée pour la recherche de code. Par exemple, il est récursif par défaut et ignore automatiquement les fichiers et répertoires listés dans .gitignore, vous n'avez donc pas à passer les mêmes options lourdes d'exclusion pour grep ou find.


568
2017-12-30 22:59



Aussi:

find ./ -type f -print0 | xargs -0 grep "foo"

mais grep -r est une meilleure réponse.


106
2018-01-01 05:14



Je l'utilise toujours (même sur Windows avec GoW - Gnu sur Windows):

grep --include="*.xxx" -nRHI "my Text to grep" *

Cela inclut les options suivantes:

--include=PATTERN

Recurse dans les répertoires en recherchant uniquement les fichiers correspondants PATTERN.

-n, --line-number

Préfixe chaque ligne de sortie avec le numéro de ligne dans son fichier d'entrée.

-R, -r, --recursive

Lire tous les fichiers sous chaque répertoire, récursivement; c'est équivalent à -d recurse option.

-H, --with-filename

Imprime le nom de fichier pour chaque correspondance.

-I     

Traite un fichier binaire comme s'il ne contenait pas de données correspondantes;
  c'est équivalent à --binary-files=without-match option.

Et je peux ajouter 'i'(-nRHIi), si je veux des résultats insensibles à la casse.

Je peux obtenir:

/home/vonc/gitpoc/passenger/gitlist/github #grep --include="*.php" -nRHI "hidden" *
src/GitList/Application.php:43:            'git.hidden'      => $config->get('git', 'hidden') ? $config->get('git', 'hidden') : array(),
src/GitList/Provider/GitServiceProvider.php:21:            $options['hidden'] = $app['git.hidden'];
tests/InterfaceTest.php:32:        $options['hidden'] = array(self::$tmpdir . '/hiddenrepo');
vendor/klaussilveira/gitter/lib/Gitter/Client.php:20:    protected $hidden;
vendor/klaussilveira/gitter/lib/Gitter/Client.php:170:     * Get hidden repository list
vendor/klaussilveira/gitter/lib/Gitter/Client.php:176:        return $this->hidden;
...

83
2018-02-14 09:33



Ou installez ack, si vous voulez un moyen beaucoup plus rapide et le font beaucoup.


53
2018-01-01 05:47



Dans les systèmes POSIX, vous ne trouvez pas -r paramètre pour grep et ton grep -rn "stuff" . ne fonctionnera pas, mais si vous utilisez find commande, il va:

find . -type f -exec grep -n "stuff" {} \; -print

Agrée par Solaris et HP-UX.


19
2017-08-08 14:56



Pour trouver le nom de files avec path contenant récursivement le particulier string utiliser la commande ci-dessous pour UNIX:

find . | xargs grep "searched-string"

pour Linux:

grep -r "searched-string" .

trouver un fichier sur UNIX serveur

find . -type f -name file_name

trouver un fichier sur le serveur LINUX

find . -name file_name

10
2018-01-29 14:31



ag est ma façon préférée de le faire maintenant github.com/ggreer/the_silver_searcher . C'est fondamentalement la même chose que ack mais avec quelques optimisations supplémentaires.

Voici un court benchmark. Je vide la mémoire cache avant chaque test (cf. https://askubuntu.com/questions/155768/how-do-i-clean-or-disable-the-memory-cache )

ryan@3G08$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
ryan@3G08$ time grep -r "hey ya" .

real    0m9.458s
user    0m0.368s
sys 0m3.788s
ryan@3G08:$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
ryan@3G08$ time ack-grep "hey ya" .

real    0m6.296s
user    0m0.716s
sys 0m1.056s
ryan@3G08$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
ryan@3G08$ time ag "hey ya" .

real    0m5.641s
user    0m0.356s
sys 0m3.444s
ryan@3G08$ time ag "hey ya" . #test without first clearing cache

real    0m0.154s
user    0m0.224s
sys 0m0.172s

8
2018-05-21 23:37



Si vous voulez seulement suivre les répertoires réels, et non les liens symboliques,

grep -r "thingToBeFound" directory

Si vous voulez suivre des liens symboliques ainsi que des répertoires réels (attention à la récursion infinie),

grep -R "thing to be found" directory

Puisque vous essayez de grep récursivement, les options suivantes peuvent également vous être utiles:

-H: outputs the filename with the line

-n: outputs the line number in the file

Donc, si vous voulez trouver tous les fichiers contenant Dark Vador dans le répertoire courant ou dans n'importe quel sous-répertoire et capturer le nom de fichier et le numéro de ligne, mais ne voulez pas que la récursivité suive des liens symboliques, la commande serait

grep -rnH "Darth Vader" .

Si vous voulez trouver toutes les mentions du mot chat dans le répertoire

/home/adam/Desktop/TomAndJerry 

et vous êtes actuellement dans le répertoire

/home/adam/Desktop/WorldDominationPlot

et vous voulez capturer le nom de fichier mais pas le numéro de ligne d'une instance de la chaîne "chats", et vous voulez que la récursivité suive les liens symboliques si elle les trouve, vous pouvez exécuter l'une des opérations suivantes

grep -RH "cats" ../TomAndJerry                   #relative directory

grep -RH "cats" /home/adam/Desktop/TomAndJerry   #absolute directory

La source:

en cours d'exécution "grep --help"

Une courte introduction aux liens symboliques, pour quiconque lit cette réponse et confuse par ma référence à eux: https://www.nixtutor.com/freebsd/understanding-symbolic-links/


8
2017-08-03 20:08