Comment puis-je grep récursivement?

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

find . | xargs grep "texthere" *
1388
demandé sur Sergey Brunov 2010-01-01 08:10:12

24 réponses

grep -r "texthere" .

Le premier paramètre représente l'expression régulière pour rechercher, tandis que la seconde représente le répertoire qui doit être recherché. Dans ce cas, . signifie le répertoire courant.

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 de l'héritage. Pour Solaris, c'est la commande ggrep .

2088
répondu Vinko Vrsalovic 2017-12-06 17:18:08

si vous connaissez l'extension ou le motif du fichier que vous souhaitez, une autre méthode est d'utiliser --include option:

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

vous pouvez également mentionner des fichiers à exclure avec --exclude .

Ag

si vous cherchez fréquemment à travers le code, Ag (le chercheur D'Argent) est une alternative beaucoup plus rapide que grep, qui est personnalisé pour le code de recherche. Par exemple, il est récursif par défaut et ignore automatiquement les fichiers et répertoires énumérés dans .gitignore , de sorte que vous ne devez pas continuer à passer les mêmes options d'exclusion encombrantes à grep ou à find.

580
répondu christangrant 2014-02-19 09:56:59

aussi:

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

mais grep -r est une meilleure réponse.

109
répondu Kurt 2018-07-10 10:41:37

j'utilise maintenant toujours (même sur Windows avec GoW -- Gnu sur Windows ):

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

qui comprend les options suivantes:

--include=PATTERN

Récursif de répertoires de fichiers de recherche de correspondance 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 de chaque répertoire, récursivement; c'est l'équivalent de l'option -d recurse .

-H, --with-filename

imprimer le nom du fichier pour chaque correspondance.

-I     

traiter un fichier binaire comme s'il ne contenait pas de données correspondantes;

cela équivaut à l'option --binary-files=without-match .

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

je peux avoir:

/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;
...
86
répondu VonC 2013-10-25 14:34:15

ou installez ack, si vous voulez un moyen beaucoup plus rapide et faites cela beaucoup.

53
répondu Andrew McGregor 2010-01-01 05:47:41

dans les systèmes POSIX, vous ne trouvez pas -r paramètre pour grep et votre grep -rn "stuff" . ne sera pas exécuté, mais si vous utilisez find commande il sera:

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

convenu par Solaris et HP-UX .

19
répondu rook 2013-08-08 15:03:40

pour trouver le nom de files avec path contenant récursivement le particulier string utiliser la commande ci-dessous au lieu de 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 LINUX server

find . -name file_name
10
répondu Girdhar Singh Rathore 2016-05-31 12:47:39

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

voici un petit benchmark. Je nettoie le 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
répondu dranxo 2017-04-13 12:22:45

si vous voulez seulement suivre des répertoires réels, et non des liens symboliques,

grep -r "thingToBeFound" directory

si vous voulez suivre des liens symboliques aussi bien 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 aussi 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 Vader dans le répertoire courant ou tout autre sous-répertoires et capturer le nom de fichier et le numéro de ligne, mais ne veulent pas que la récursion de suivre des liens symboliques, la commande serait

grep -rnH "Darth Vader" .

si vous voulez trouver toutes les mentions du mot cat dans l'annuaire

/home/adam/Desktop/TomAndJerry 

et vous êtes actuellement dans l'annuaire

/home/adam/Desktop/WorldDominationPlot

et vous voulez capturer le nom du fichier mais pas le numéro de ligne d'une instance de la chaîne "cats", et vous voulez que la récursion à suivre les liens symboliques s'il 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

Source:

running "grep --help "

une brève introduction à des liens symboliques, pour quiconque lisant cette réponse et confus par ma référence à eux: https://www.nixtutor.com/freebsd/understanding-symbolic-links /

8
répondu SarcasticSully 2016-08-03 20:08:36

juste les noms de fichiers peuvent être utiles

grep -r -l "foo" .
8
répondu chim 2017-08-29 08:46:44

globbing **

en utilisant grep -r fonctionne, mais il peut surcharger, en particulier dans les grands dossiers.

pour un usage plus pratique, voici la syntaxe qui utilise la syntaxe globbing ( ** ):

grep "texthere" **/*.txt

qui ne saisit que des fichiers spécifiques avec le motif sélectionné. Il fonctionne pour les coquillages pris en charge tels que Bash +4 ou zsh .

pour activer cette fonctionnalité, Lancez: shopt -s globstar .

voir aussi: Comment trouver tous les fichiers contenant du texte spécifique sur Linux?

git grep

pour les projets sous contrôle de version Git, utiliser:

git grep "pattern"

ce qui est beaucoup plus rapide.

ripgrep

pour les projets de plus grande envergure, l'outil de grêchage le plus rapide est ripgrep qui greps fichiers récursivement par défaut:

rg "pattern" .

il est construit sur le dessus de moteur regex de Rust qui utilise automata finis, SIMD et des optimisations littérales agressives pour rendre la recherche très rapide. Vérifier le analyse détaillée ici .

8
répondu kenorb 2018-04-11 10:12:51

cela devrait fonctionner:

grep -R "texthere" *
5
répondu sumit kumar 2014-01-07 00:18:33

si vous recherchez un contenu spécifique dans tous les fichiers d'une structure de répertoire, vous pouvez utiliser find car il est plus clair ce que vous faites:

find -type f -exec grep -l "texthere" {} +

Note que -l (downcase de L) affiche le nom du fichier qui contient le texte. Retirez-le si vous voulez plutôt Imprimer la correspondance elle-même. Ou utilisez -H pour obtenir le fichier avec la correspondance. Au total, les autres possibilités sont les suivantes:

find -type f -exec grep -Hn "texthere" {} +

-n imprime le numéro de ligne.

5
répondu fedorqui 2015-11-30 16:19:08

C'est celui qui a fonctionné pour ma valise sur ma machine actuelle (git bash sur windows 7):

find ./ -type f -iname "*.cs" -print0 | xargs -0 grep "content pattern"

j'oublie toujours le-print0 et -0 pour les chemins avec des espaces.

EDIT: mon outil préféré est maintenant ripgrep: https://github.com/BurntSushi/ripgrep/releases . Il est vraiment rapide et a de meilleures valeurs par défaut (comme la récursive par défaut). Même exemple que ma réponse originale, mais en utilisant ripgrep: rg -g "*.cs" "content pattern"

5
répondu arkod 2018-01-15 12:36:32

dans mon serveur IBM AIX (version OS: AIX 5.2), utiliser:

find ./ -type f -print -exec grep -n -i "stringYouWannaFind" {} \; 

ceci imprimera le nom du chemin/fichier et le numéro de ligne relatif dans le fichier comme:

./ inc / xxxx_x.h

2865: /** Description : stringYouWannaFind * /

de toute façon, ça marche pour moi:)

3
répondu user3606336 2015-07-09 09:37:27

grep -r "texthere" . (période de préavis à la fin)

(^crédit: https://stackoverflow.com/a/1987928/1438029 )


Clarification:

grep -r "texthere" / (de manière récursive grep tous répertoires et sous-répertoires)

grep -r "texthere" . (de manière récursive grep ces répertoires et sous-répertoires)

grep récursive

grep [options] PATTERN [FILE...]

[options]

-R, -r, --recursive

lire tous les fichiers sous chaque répertoire, de façon récursive.

cela équivaut à l'option -d recurse ou --directories=recurse .

http://linuxcommand.org/man_pages/grep1.html

grep aide

$ grep --help

$ grep --help |grep recursive
  -r, --recursive           like --directories=recurse
  -R, --dereference-recursive

Alternatives

ack ( http://beyondgrep.com / )

ag ( http://github.com/ggreer/the_silver_searcher )

3
répondu Geoffrey Hale 2017-05-23 12:02:56

ci-dessous se trouve la commande de recherche d'un String récursivement sur Unix et Linux environnement.

pour UNIX commande est:

find . -name "string to be searched" -exec grep "text" "{}" \;

pour Linux commande est:

grep -r "string to be searched" .
3
répondu Girdhar Singh Rathore 2016-03-08 07:32:12

je suppose que c'est ce que vous essayez d'écrire

grep myText $(find .)

et cela peut être quelque chose d'autre utile si vous voulez trouver les fichiers grep hit

grep myText $(find .) | cut -d : -f 1 | sort | uniq
2
répondu Victor Faria 2016-10-03 20:27:28

en 2018, vous voulez utiliser ripgrep ou the-silver-searcher parce qu'ils sont beaucoup plus rapides que les alternatives.

voici un répertoire avec 336 sous-répertoires de premier niveau:

% find . -maxdepth 1 -type d | wc -l
     336

% time rg -w aggs -g '*.py'
...
rg -w aggs -g '*.py'  1.24s user 2.23s system 283% cpu 1.222 total

% time ag -w aggs -G '.*py$'
...
ag -w aggs -G '.*py$'  2.71s user 1.55s system 116% cpu 3.651 total

% time find ./ -type f -name '*.py' | xargs grep -w aggs
...
find ./ -type f -name '*.py'  1.34s user 5.68s system 32% cpu 21.329 total
xargs grep -w aggs  6.65s user 0.49s system 32% cpu 22.164 total

sur OSX, il installe ripgrep : brew install ripgrep . Cela installe silver-searcher : brew install the_silver_searcher .

2
répondu hughdbrown 2018-01-09 17:30:16

notez que les types de solutions find . -type f | xargs grep whatever vont rencontrer des erreurs" liste D'arguments à longue " quand il y a trop de fichiers appariés par find.

le meilleur pari est grep -r mais si cela n'est pas disponible, utilisez find . -type f -exec grep -H whatever {} \; à la place.

1
répondu m.thome 2014-05-21 18:12:47

Juste pour le fun, rapide et sale à la recherche de *.txt file si la réponse @christangrant est trop longue à taper : -)

grep -r texthere .|grep .txt

1
répondu PJ Brunet 2015-08-12 19:14:18

pour une liste des drapeaux disponibles:

grep --help 

renvoie toutes les correspondances pour le regexp texthere dans le répertoire courant, avec le numéro de ligne correspondant:

grep -rn "texthere" .

renvoie toutes les correspondances pour texthere , en commençant par le répertoire racine, avec le numéro de ligne correspondant et en ignorant le cas:

grep -rni "texthere" /

drapeaux utilisés ici:

  • -r récursive
  • -n numéro de ligne d'impression avec sortie
  • -i ignorer la casse
1
répondu JSON C11 2017-09-30 22:50:39

Voici une fonction récursive (testée légèrement avec bash et sh) qui traverse tous les sous-dossiers d'un dossier donné ($1) et en utilisant grep recherche une chaîne donnée ($3) dans des fichiers donnés ($2):

$ cat script.sh
#!/bin/sh

cd ""

loop () {
    for i in *
    do
        if [ -d "$i" ]
        then
            # echo entering "$i"
            cd "$i"
            loop "" ""
        fi
    done

    if [ -f "" ]
    then
        grep -l "" "$PWD/"
    fi

    cd ..
}

loop "" ""

L'exécuter et un exemple de sortie:

$ sh script start_folder filename search_string
/home/james/start_folder/dir2/filename
0
répondu James Brown 2017-06-09 15:21:42
The syntax is:
cd /path/to/dir
grep -r <"serch_word name"> .
-2
répondu Poo 2016-01-18 08:28:53