Usare grep con il flag --exclude-dir per escludere più directory


16

Sto cercando un'applicazione di Ruby on Rails per una parola usando grepsu OSX e vorrei escludere le directory che corrispondono a un determinato modello.

Sto usando il seguente comando:

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

Questo comando non sta facendo quello che pensavo avrebbe fatto. Ecco come pensavo che avrebbe funzionato:

  • i - ricerca senza distinzione tra maiuscole e minuscole
  • n - stampa il numero di riga in cui è stato trovato il motivo
  • R - cerca ricorsivamente
  • w - Voglio solo parole intere, ad es. abbinare "direct" ma non "directory"
  • -E - usa un'espressione regolare estesa
  • 'diretto' - l'espressione regolare che voglio abbinare
  • . - cerca nella directory corrente
  • --exclude-dir -E 'git | log | asset' - esclude le directory che corrispondono a git o log o asset.

In termini di directory di esclusione, il comando finisce ancora per cercare nelle directory './git' e './log' , così come in './app/assets'

Mi manca ovviamente una conoscenza fondamentale, ma non so di cosa si tratti.

Risposte:


16

La descrizione della pagina man per quell'opzione è un po 'fuorviante ... È un modello come in globs, non un modello come in regex . Per la infopagina :

--exclude-dir = GLOB

Salta qualsiasi directory della riga di comando con un suffisso del nome che corrisponda al modello GLOB. Durante la ricerca ricorsiva, saltare qualsiasi sottodirectory il cui nome di base corrisponde a GLOB. Ignora eventuali barre finali ridondanti in GLOB.

Quindi, nel tuo caso potresti eseguire:

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

per escludere le directory di nome git, loge assetso per esempio

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

per escludere i nomi di directory che terminano gito iniziano con asset.


Molto interessante. Immagino che dovrei cercare cos'è un glob.
Steven L.,

Mi dispiace ma nessuno di questi sembra funzionare. Sarebbe d'aiuto se dicessi che sto usando questa versione di grep: grep (BSD grep) 2.5.1-FreeBSD?
Steven L.,

Sono perplesso perché sto leggendo il manuale per BSD grep ( freebsd.org/cgi/man.cgi?query=grep&sektion=&n=1 ) e non c'è menzione di --exclude-dir. Boo.
Steven L.,

2
OK - Ora vedo il problema. Questa deve essere una versione modificata di grep utilizzata solo dal sistema Apple. Sono su Mac OS X. Mi dispiace per la confusione qui. Sono sicuro che c'è un forum da qualche altra parte su StackExchange in cui posso pubblicare.
Steven L.,

@ user245185 sei su BSD o su OSX? Entrambi sono in argomento qui, ma ti preghiamo di modificare la tua domanda e di dirci quale sistema operativo stai utilizzando. I comportamenti degli strumenti standard differiscono tra le implementazioni mentre stai scoprendo.
terdon

8

--exclude-dirnon capisce |.

Tuttavia, puoi ottenere lo stesso effetto specificando --exclude-dirpiù volte, una per ogni directory che desideri escludere:

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

Ha funzionato per me. Volevo escludere la home directory ma non ha funzionato con altre opzioni come --exclude-dir={home}. Ho lavorato quando ho digitato--exclude-dir 'home'
Mubin Icyer il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.