2009-05-14 12 views
16

Sto lavorando a un programma Python che fa un uso massiccio di uova (Plone). Ciò significa che ci sono 198 directory piene di codice Python che potrei voler cercare mentre eseguo il debug. Esiste un buon modo per cercare solo i file .py solo in quelle directory, evitando codice non correlato e file binari di grandi dimensioni?Come si passa attraverso il codice che vive in molte directory diverse?

risposta

19
find DIRECTORY -name "*.py" | xargs grep PATTERN 

Tra l'altro, dal momento che la scrittura di questo, ho scoperto ack, che è una soluzione molto migliore.

+0

find 'echo $ PYTHONPATH | sed "s /:// g" '-name" * .py "| xargs grep PATTERN – joeforker

+0

è bello. Non ci avevo pensato. –

+0

fortunatamente nessuna delle voci in $ PYTHONPATH contiene un ''. – joeforker

9
grep -r -n "PATTERN" --include="*.py" DIRECTORY 
+0

Mi piace -n includere i numeri di riga. Sorprendentemente, il 'find | la versione di xargs' è leggermente più veloce. – joeforker

+0

Trovo che grep tende ad accelerare nelle ricerche successive però. –

4

trovare <directory> -name '* .py' grep -exec <modello> {} \;

+1

Questa versione è 26 volte più lenta del | xargs o soluzione standalone grep perché esegue grep 16.836 volte invece di una volta. – joeforker

+2

ma se si finisce con un + al posto di \ ;, allora è equivalente alla soluzione xargs, tranne che non si rompe se i vostri nomi di percorso hanno spazi tra loro. –

18

consiglio vivamente ack, sostituto grep "volto a programmatori con grandi alberi di codice sorgente eterogenei" (dal sito)

6

Io uso anche ACK molto in questi giorni. Ho fatto modificarlo un po 'per trovare tutti i tipi di file rilevanti:

# Add zcml to the xml type: 
--type-add 
xml=.zcml 

# Add more files the plone type: 
--type-add 
plone=.dtml,.zpt,.kss,.vpy,.props 

# buildout config files 
--type-set 
buildout=.cfg 

# Include our page templates to the html type so we can limit our search: 
--type-add 
html=.pt,.zpt 

# Create txt file type: 
--type-set 
txt=.txt,.rst 

# Define i18n file types: 
--type-set 
i18n=.pot,.po 

# More options 
--follow 
--ignore-case 
--nogroup 

importante da ricordare è che ACK non trovare i file se l'estensione non è nella sua configurazione. Vedi "ack --help-types" per tutti i tipi disponibili.

Suppongo anche che si stia utilizzando omelette in modo da poter grep/ack/trovare tutti i file correlati?

2

C'è anche GNU idutils se si desidera grep per gli identificatori in un grande albero di sorgenti molto molto rapidamente. È necessario creare preventivamente un database di ricerca, eseguendo mkid (e modificando il suo file di configurazione per non ignorare i file .py). z3c.recipe.tag si prende cura di questo, se si utilizza buildout.

1

La mia vita di grepping è molto più soddisfacente da quando ho scoperto il comando rgrep di Emacs.

Dire che voglio trovare "IPortletDataProvider" nel sorgente di Plone. Faccio:

  1. M-x rgrep
  2. Emacs richiede la stringa di ricerca (IPortletDataProvider)
  3. ... poi che i file da ricercare (* .py)
  4. ... quindi quale directory (~/Plone/buildout-cache/uova). Se sto già modificando un file, questo fa automaticamente riferimento alla directory del file, che di solito è esattamente ciò che voglio.

I risultati vengono visualizzati in un nuovo buffer. Nella parte superiore è in esecuzione il comando find | xargs grep Emacs. Tutte le partite sono evidenziate. Posso cercare il buffer usando i comandi standard di ricerca del testo. Meglio di tutti, posso premere Invio (o fare clic) su una partita per aprire quel file.

È un bel modo di lavorare. Mi piace il fatto che non devo ricordare le sequenze degli argomenti find | xargs grep, ma che tutto quel potere è lì se ne ho bisogno.

Emacs rgrep example

1

Solo nel caso in cui si desidera un non-riga di comando soluzione OSS ...

io uso PyCharm. Ha integrato il supporto per buildout.Lo puntate su un bin/istanza generato dal buildout e imposta le dipendenze esterne dei progetti su tutte le uova utilizzate dall'istanza. Quindi tutto l'introspezione e la navigazione del codice IDE funzionano bene. Definizione Goto, istanze goto, supporto refactoring e ovviamente ricerca.

4

Questo problema è stato la motivazione per la creazione di collective.recipe.omelette. È una ricetta buildout che può collegare simbolicamente tutte le uova dal set di lavoro in una struttura di directory, a cui puoi puntare il tuo programma di ricerca preferito.

+0

Le risposte orientate alla grep sono false. Ti porteranno a trovare più versioni di file, tutte tranne una in versioni non utilizzate del codice (buildout potrebbe aver recuperato diverse versioni di uova nel tempo). Usa omelette e svuota la struttura del link simbolico che genera. –

2

Si consiglia di cercare grin, omelette quando si lavora con plone e la funzionalità pydev 'Browser globale' (con eclipse o aptana studio).

+0

Leggi qui circa ghigno: http://rhodesmill.org/brandon/2011/grin-and-search-it – pbauer

+0

Ecco utile script per importare la cartella frittata + src a Eclipse: http://svn.plone.org/svn /collective/collective.eclipsescripts/trunk/README.txt –

2

E semplicemente perché non ci sono abbastanza risposte ...

Se si sta sviluppando di routine, vale la pena lo sforzo per installare Eclipse con Pydev (o ancora più semplice, Aptana Studio - che è un Eclipse modificato) , nel qual caso gli strumenti di ricerca sono proprio lì.

+0

Ecco un uno script che consente l'importazione buildout + frittata per Aptana: http://svn.plone.org/svn/collective/collective.eclipsescripts/trunk/README.txt –

1

OpenGrok è una scelta eccellente per la ricerca e la navigazione fonte. Funziona su Java, però.

Mi piacerebbe che ci fosse qualcosa di simile http://opengrok.plone.org/

Problemi correlati