Cerca ricorsivamente la cartella ma escludi la sottocartella svn


10

Voglio trovare tutte le occorrenze fooin un file system di grandi dimensioni gestito da SVN, ma non voglio abbinare nulla di contenuto in nessuna .svndirectory.

Ottengo corrispondenze immediate quando lo faccio, grep -l -e 'foo' *ma quando provo ad escludere le directory svn con grep -l -e 'foo' --exclude-dir=".svn"il comando si blocca.

Che cosa sto facendo di sbagliato?

Risposte:


11

--exclude-dirnon soppianta la necessità di elencare i file dalla riga di comando. Stai "appendendo" perché grepè in attesa di input standard.

grep -l -e 'foo' --exclude-dir = ". svn" *

Prendi in considerazione l'utilizzo di ack , che esclude .svne cartelle simili (e ha molte altre funzionalità) per impostazione predefinita.


2
Più pulito se si *passa a ., nel caso in cui ci siano altre cartelle nascoste che dovrebbero essere ricercate.
Kevin,

o forse vuoi usare --recursive .invece, visto che l'OP ha già GNU grep.
jw013,

Personalmente, ho shopt -s dotglobin Bash, quindi *contiene già dot-file. -rè carino, ma lo ackfa anche di default :)
effimero

5

Potresti essere interessato a ack . Esegue ricerche ricorsive (e altre operazioni simili a grep) ed esclude directory come .svn o .git per impostazione predefinita.


Come follow-up su questo, attualmente uso ag, che simile, ma più veloce.
WhyNotHugo

2

La grep --exclude-dir...soluzione deve andare bene, ma solo per mostrare un altro modo, si può fare questo con il find's -prune:

find -name .svn -prune -o -type f -exec grep -l "$pattern" {} +

Se vuoi eseguire qualcosa di più, findè meglio di un semplice grep -r:

find -name .svn -prune -o -type f -exec grep -q "$pattern" {} \; -exec ./process {} \;

1

Se non si desidera accedere a directory come .svn mai prima, è possibile impostare la $GREP_OPTIONSvariabile per escluderla come di seguito:

export GREP_OPTIONS="--exclude-dir=\*/.svn/\*"

Basta aggiungere questa linea alla tua .bashrce le tue grees ricorsive non entreranno più nelle .svndirectory. Certo, può essere ricco quanto vuoi:

export GREP_OPTIONS="--exclude-dir=\*/.svn/\* --exclude-dir=\*/.hg/\* --exclude-dir=\*/.git/\* --exclude=\*~"

1
Personalmente lo faccio usando un alias in modo da poter bypassare l'elenco di esclusione se devo effettivamente cercare all'interno di quelle cartelle, posso semplicemente usare grep grey senza dover annullare / annullare la variabile. Mi permette anche di mantenere un elenco di cartelle che posso facilmente espandere e che ho aggiunto automaticamente al mio elenco di esclusioni senza dover fare più digitazioni.
dragon788,

Questo è un buon approccio. Ha anche il vantaggio che, se hai bisogno di accedere alle cartelle, non dimenticherai di aver impostato una variabile. (Non che avessi mai avuto bisogno di prenderli in giro.) Ma TBH in questi giorni uso ag (un clone ack) per queste cose ^^
brandizzi

0

Ecco anche una soluzione awk:

find . | awk '$0 !~ /.svn/{print}' | awk '/foo/{print}'

Fondamentalmente, da tutti i file, elimina quelli che corrispondono a /.svn/ e poi, da quelli, stampa solo quelli che corrispondono a / foo /. Mi piace anche questa soluzione in quanto puoi facilmente usare i risultati con ls. Ad esempio, puoi usare

ls -tl $(find . | awk '$0 !~ /.svn/{print}' | awk '/foo/{print}')

per visualizzare una visualizzazione elenco ordinata per data di modifica. Inoltre, è bello avere il percorso completo dei risultati se si desidera fare qualcos'altro con loro (aprirli, eseguire, ecc.)

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.