Utilisation de grep avec l'indicateur --exclude-dir pour exclure plusieurs répertoires

16

Je recherche un mot à l'aide d'une application Ruby on Rails grepsur OSX, et je voudrais exclure les répertoires qui correspondent à un certain modèle.

J'utilise la commande suivante:

grep -inRw -E 'direct' . --exclude-dir -E 'git|log|asset'

Cette commande ne fait pas ce que je pensais qu'elle ferait. Voici comment je pensais que cela fonctionnerait:

  • i - recherche insensible à la casse
  • n - numéro de ligne d'impression dans lequel se trouve le motif
  • R - recherche récursive
  • w - Je veux seulement des mots entiers - c.-à-d. correspondre à "direct" mais pas à "répertoire"
  • -E - utilise une expression régulière étendue
  • 'direct' - l'expression régulière que je veux faire correspondre
  • . - recherche dans le répertoire courant
  • --exclude-dir -E 'git | log | asset' - exclut les répertoires qui correspondent à git ou log ou asset.

En termes de répertoires d'exclusion, la commande finit toujours par rechercher dans les répertoires './git' et './log' , ainsi que dans './app/assets'

Je manque évidemment de connaissances fondamentales, mais je ne sais pas ce que c'est.

Steven L.
la source

Réponses:

16

La description de la page de manuel pour cette option est en quelque sorte trompeuse ... C'est un modèle comme dans les globes pas un modèle comme dans les expressions régulières . Par la infopage :

--exclude-dir = GLOB

Ignorez tout répertoire de ligne de commande dont le suffixe de nom correspond au modèle GLOB. Lors d'une recherche récursive, ignorez tout sous-répertoire dont le nom de base correspond à GLOB. Ignorez les barres obliques redondantes dans GLOB.

Donc, dans votre cas, vous pouvez exécuter:

grep -inRw -E 'direct' . --exclude-dir={git,log,assets}

pour exclure les répertoires nommés git, loget assetsou par exemple

grep -inRw -E 'direct' . --exclude-dir={\*git,asset\*}

pour exclure les noms de répertoire se terminant par gitou commençant par asset.

don_crissti
la source
Très intéressant. Je suppose que je devrais chercher ce qu'est un glob.
Steven L.
Je suis désolé mais aucun de ceux-ci ne semble fonctionner. Serait-il utile si je disais que j'utilise cette version de grep: grep (BSD grep) 2.5.1-FreeBSD?
Steven L.
Je suis perplexe parce que je lis le manuel de grep bsd ( freebsd.org/cgi/man.cgi?query=grep&sektion=&n=1 ) et il n'y a aucune mention de --exclude-dir. Huer.
Steven L.
2
OK - je vois le problème maintenant. Il doit s'agir d'une version modifiée de grep utilisée uniquement par le système Apple. Je suis sur Mac OS X. Je suis désolé pour la confusion ici. Je suis sûr qu'il y a un forum ailleurs sur stackexchange sur lequel je peux poster.
Steven L.
@ user245185 êtes-vous sur BSD ou sur OSX? Les deux sont sur le sujet ici, mais veuillez modifier votre question et nous dire quel système d'exploitation vous utilisez. Les comportements des outils standard diffèrent entre les implémentations que vous découvrez.
terdon
8

--exclude-dirne comprend pas |.

Vous pouvez cependant obtenir le même effet en spécifiant --exclude-dirplusieurs fois, une pour chaque répertoire que vous souhaitez exclure:

grep -inRw -E --exclude-dir 'asset' --exclude-dir 'git' --exclude-dir 'log' 'direct'
John1024
la source
Ça a marché pour moi. Je voulais exclure le répertoire personnel mais cela ne fonctionnait pas avec d'autres options comme --exclude-dir={home}. J'ai travaillé quand j'ai tapé--exclude-dir 'home'
Mubin Icyer