Ich arbeite an einem Python-Programm, das stark von Eiern Gebrauch macht (Plone). Das bedeutet, dass es 198 Verzeichnisse voller Python-Code gibt, die ich beim Debuggen durchsuchen möchte. Gibt es eine gute Möglichkeit, nur die .py-Dateien nur in diesen Verzeichnissen zu durchsuchen und damit nicht verwandten Code und große Binärdateien zu vermeiden?Wie grämt man Code, der in vielen verschiedenen Verzeichnissen existiert?
Antwort
find DIRECTORY -name "*.py" | xargs grep PATTERN
By the way, das seit schreiben, habe ich ack, entdeckt, die eine viel bessere Lösung ist.
grep -r -n "PATTERN" --include="*.py" DIRECTORY
Ich mag die Zeilennummern mit -n. Überraschenderweise ist das 'finden | Xargs' Version ist etwas schneller. – joeforker
Ich finde, dass Grep dazu tendiert, in aufeinanderfolgenden Suchen zu beschleunigen. –
<Verzeichnis> -name '* .py' -exec grep finden <Muster> {} \;
Diese Version ist 26 mal langsamer als die | xargs oder standalone grep solution, da es grep 16.836 mal statt einmal ausführt. – joeforker
Wenn Sie es jedoch mit einem + anstelle von \; enden, entspricht es der Lösung von xargs, außer dass es nicht bricht, wenn Ihre Pfadnamen Leerzeichen enthalten. –
I ack stark empfehlen würde, einen grep Ersatz „an Programmierer mit großen Bäumen heterogener Quellcode soll“ (von der Website)
I ack viel nutzen auch in diesen Tagen. Ich habe es ein bisschen zwicken alle relevanten Dateitypen zu finden:
# 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
wichtig zu bedenken ist, dass ack keine Dateien finden, wenn die Erweiterung nicht in seiner Konfiguration ist. Siehe "ack --help-types" für alle verfügbaren Typen.
Ich nehme auch an, dass Sie omelette verwenden, so dass Sie alle verwandten Dateien grep/ack/finden können?
Es gibt auch GNU idutils, wenn Sie sehr schnell Identifikatoren in einem großen Quellbaum suchen möchten. Es erfordert den Aufbau einer Suchdatenbank im Voraus, indem Sie mkid ausführen (und seine Konfigurationsdatei optimieren, um .py-Dateien nicht zu ignorieren). z3c.recipe.tag kümmert sich darum, wenn Sie Buildout verwenden.
Mein Grepping-Leben ist viel befriedigender, seit ich Emacs 'rgrep-Befehl entdeckt habe.
Angenommen, ich möchte 'IPortletDataProvider' in Plones Quelle finden. Ich tue:
M-x rgrep
- Emacs fragt nach dem Suchbegriff (IPortletDataProvider)
- ... dann die (* Py)
- suchen Dateien ... dann, welches Verzeichnis (~/Plone/Build-Cache/Eier). Wenn ich bereits eine Datei bearbeite, ist dies standardmäßig das Verzeichnis dieser Datei, was normalerweise genau das ist, was ich möchte.
Die Ergebnisse erscheinen in einem neuen Puffer. An der Spitze ist der find | xargs grep
Befehl Emacs lief. Alle Übereinstimmungen sind hervorgehoben. Ich kann den Puffer mit den Standardtextsuchbefehlen suchen. Das Beste von allem, ich kann Enter drücken (oder klicken) auf eine Übereinstimmung, um diese Datei zu öffnen.
Es ist eine ziemlich nette Art zu arbeiten. Ich mag, dass ich mich nicht an find | xargs grep
Argumentsequenzen erinnern muss, aber dass all diese Kraft da ist, wenn ich sie brauche.
Gerade falls Sie eine nicht-Command OSS-Lösung wollen ...
Ich benutze PyCharm. Es wurde Unterstützung für Buildout eingebaut.Sie verweisen auf eine von buildout generierte Bin/Instanz und legen die externen Abhängigkeiten des Projekts auf alle von der Instanz verwendeten Eier fest. Dann funktionieren alle IDE-Introspektion und Code-Navigation gut. Goto-Definition, Goto-Instanzen, Refactoring-Unterstützung und natürlich Suche.
Dieses Problem war die Motivation für die Erstellung von collective.recipe.omelette. Es ist ein Buildout-Rezept, das alle Eier aus Ihrem Arbeitssatz in eine Verzeichnisstruktur symbolisieren kann, auf die Sie Ihr Lieblingssuchprogramm richten können.
Die Grep-orientierten Antworten sind rote Heringe. Sie werden Sie dazu führen, mehrere Versionen von Dateien zu finden, alle bis auf eine in nicht verwendeten Versionen des Codes (das Build hat möglicherweise im Laufe der Zeit verschiedene Versionen von Eizellen abgerufen). Verwenden Sie Omelett und grep die Symlink-Struktur, die es generiert. –
Ich empfehle grin zu suchen, omelette bei der Arbeit mit Plone und der Pydev-Funktion 'Globals Browser' (mit Eclipse oder Aptana Studio).
Lesen Sie hier über grinsen: http://rhodesmill.org/brandon/2011/grin-and-search-it – pbauer
Hier sind hilfreiche Skripte, Omelette + src Ordner zu Eclipse zu importieren: http://svn.plone.org/svn /collective/collective.eclipssecripts/trunk/README.txt –
Und nur weil es nicht genug Antworten ...
Wenn Sie regelmäßig entwickelst, es lohnt sich der Aufwand Eclipse-Installation mit Pydev (oder noch einfacher, Aptana Studio - die eine modifizierte Eclipse ist) In diesem Fall sind die Suchwerkzeuge genau da.
Hier ist ein Skript, das den Import von Buildout + Omelett nach Aptana ermöglicht: http://svn.plone.org/svn/collective/collective.clipsescripts/trunk/README.txt –
OpenGrok ist eine ausgezeichnete Wahl für Quellensuche und Navigation. Läuft jedoch auf Java.
Ich wünschte wirklich, es war so etwas wie http://opengrok.plone.org/
find 'echo $ PYTHONPATH | sed "s /:// g" '-name" * .py "| xargs grep PATTERN – joeforker
das ist nett. Hatte nicht daran gedacht. –
Glücklicherweise enthält keiner der Einträge in $ PYTHONPATH ein ''. – joeforker