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
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.
grep -r -n "PATTERN" --include="*.py" DIRECTORY
Mi piace -n includere i numeri di riga. Sorprendentemente, il 'find | la versione di xargs' è leggermente più veloce. – joeforker
Trovo che grep tende ad accelerare nelle ricerche successive però. –
trovare <directory> -name '* .py' grep -exec <modello> {} \;
Questa versione è 26 volte più lenta del | xargs o soluzione standalone grep perché esegue grep 16.836 volte invece di una volta. – joeforker
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. –
consiglio vivamente ack, sostituto grep "volto a programmatori con grandi alberi di codice sorgente eterogenei" (dal sito)
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?
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.
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:
M-x rgrep
- Emacs richiede la stringa di ricerca (IPortletDataProvider)
- ... poi che i file da ricercare (* .py)
- ... 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.
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.
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.
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. –
Si consiglia di cercare grin, omelette quando si lavora con plone e la funzionalità pydev 'Browser globale' (con eclipse o aptana studio).
Leggi qui circa ghigno: http://rhodesmill.org/brandon/2011/grin-and-search-it – pbauer
Ecco utile script per importare la cartella frittata + src a Eclipse: http://svn.plone.org/svn /collective/collective.eclipsescripts/trunk/README.txt –
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ì.
Ecco un uno script che consente l'importazione buildout + frittata per Aptana: http://svn.plone.org/svn/collective/collective.eclipsescripts/trunk/README.txt –
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/
- 1. Passa attraverso risorse incorporate di lingue/culture diverse in C#
- 2. jqGrid come si passa attraverso la griglia?
- 3. R - Passa attraverso diverse matrici senza usare il loop! Aiuto per un semplice codice
- 4. Il codice viene eseguito correttamente solo quando lo si passa attraverso il debugger?
- 5. C# che passa attraverso un array
- 6. iOS Audio Passa attraverso
- 7. Come usare 'is' quando il tipo passa attraverso il metodo?
- 8. Come disegnare una curva che passa attraverso alcuni punti
- 9. Passa attraverso la mappa in Groovy?
- 10. Debugging attraverso diverse soluzioni in Visual Studio
- 11. Passa attraverso l'oggetto nei nunjucks?
- 12. Come avviare tmux con diverse finestre in diverse directory?
- 13. programma funziona quando si passa attraverso ma non durante l'esecuzione
- 14. Come strisciare attraverso diverse schede ionici
- 15. Errore xCode per iPhone EXC_BAD_ACCESS si verifica solo quando si passa attraverso il debugger?
- 16. Molte a molte relazioni nel codice EF5 Innanzitutto, come posso specificare il nome della tabella?
- 17. API Web Asp.Net che passa l'utente attraverso i layer
- 18. Variabile di ambiente Windows che passa attraverso OpenSSH
- 19. Looping attraverso una directory
- 20. Passa attraverso sottocartelle e file in una directory radice specificata dall'utente
- 21. Ottieni la directory in cui si trova il codice eseguito
- 22. Includere PHP, non funziona quando il codice php incluso è per i file in diverse directory
- 23. XSD e WSDL in diverse directory
- 24. Come passare attraverso il codice in Google chrome javascript debugger
- 25. Come eseguire il codice che si trova in una stringa?
- 26. Usa Foreman avviare Rack App trovano in diverse directory
- 27. Cicli attraverso le directory hdfs
- 28. Passa attraverso ogni nuovo oggetto da Costruttore
- 29. Tutto il traffico HTTP passa attraverso HTTP.SYS su Windows?
- 30. Molte a molte ricerche in Django
find 'echo $ PYTHONPATH | sed "s /:// g" '-name" * .py "| xargs grep PATTERN – joeforker
è bello. Non ci avevo pensato. –
fortunatamente nessuna delle voci in $ PYTHONPATH contiene un ''. – joeforker