web-dev-qa-db-fra.com

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

Je recherche dans une application Ruby on Rails for a Word using grep on OSX, and j'aimerais 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 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'est-à-dire, 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.

18
Steven L.

La description de la page de manuel pour cette option est en quelque sorte trompeuse ... C'est un modèle comme dans globs pas un modèle comme dans expression régulière . Par la page info :

--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 toutes 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, log et assets ou par ex.

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

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

19
don_crissti

--exclude-dir ne comprend pas |.

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

grep -inRw -E --exclude-dir 'asset' --exclude-dir 'git' --exclude-dir 'log' 'direct'
8
John1024