Подтвердить что ты не робот

Как вы используете grep через код, который живет во многих разных каталогах?

Я работаю над программой Python, которая сильно использует яйца (Plone). Это означает, что есть 198 каталогов, полный кода Python, который я могу искать во время отладки. Есть ли хороший способ поиска только .py файлов только в этих каталогах, избегая несвязанного кода и больших двоичных файлов?

4b9b3361

Ответ 1

find DIRECTORY -name "*.py" | xargs grep PATTERN
Кстати, с момента написания этого я обнаружил ack, что намного лучше.

Ответ 2

Я бы настоятельно рекомендовал ack, заменитель grep, "нацеленный на программистов с большими деревьями разнородного исходного кода" (с веб-сайта)

Ответ 3

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

Ответ 4

В наши дни я тоже много использую. Я немного изменил его, чтобы найти все соответствующие типы файлов:

# 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

Важно помнить, что ack не найдет файлы, если расширение не в его конфигурации. См. "Ack -help-types" для всех доступных типов.

Я также предполагаю, что вы используете omelette, чтобы вы могли grep/ack/найти все связанные файлы?

Ответ 5

find <directory> -name '*.py' -exec grep <pattern> {} \;

Ответ 6

Эта проблема была мотивацией для создания collect.recipe.omelette. Это рецепт сборки, который может символизировать все яйца из вашего рабочего набора в одну структуру каталогов, в которую вы можете указать свою любимую утилиту поиска.

Ответ 7

Там также GNU idutils, если вы хотите очень быстро grep для идентификаторов в большом исходном дереве. Для этого требуется заранее создать базу данных поиска, запустив mkid (и настроив его файл конфигурации, чтобы не игнорировать файлы .py). z3c.recipe.tag позаботится об этом, если вы используете buildout.

Ответ 8

Я рекомендую grin для поиска, omelette при работе с plone и функцией pydev "Globals browser" (с затмением или студией aptana).

Ответ 9

И просто потому, что ответов недостаточно...

Если вы регулярно разрабатываете, стоит потратить усилия на установку Eclipse с Pydev (или даже проще, Aptana Studio - это модифицированный Eclipse), и в этом случае инструменты поиска находятся там.

Ответ 10

Моя жизнь grepping является более удовлетворительной с момента обнаружения команды rgrep Emacs.

Скажем, я хочу найти "IPortletDataProvider" в источнике Plone. Я:

  • M-x rgrep
  • Emacs запрашивает строку поиска (IPortletDataProvider)
  • ... затем какие файлы искать (*.py)
  • ... затем каталог (~/Plone/buildout-cache/eggs). Если я уже редактирую файл, это значение по умолчанию относится к этому файловому каталогу, который обычно является именно тем, что я хочу.

Результаты появляются в новом буфере. В верхней части находится команда find | xargs grep Emacs. Все совпадения выделены. Я могу искать буфер, используя стандартные команды текстового поиска. Лучше всего, я могу нажать Enter (или щелкнуть) по совпадению, чтобы открыть этот файл.

Это неплохой способ работать. Мне нравится, что мне не нужно запоминать последовательности аргументов find | xargs grep, но вся эта сила есть, если мне это нужно.

Пример Emacs rgrep

Ответ 11

На всякий случай вам понадобится решение OSS без командной строки...

Я использую pycharm. Он построил поддержку для строительства. Вы указываете его на созданный сгенерированный бит/экземпляр, и он устанавливает внешние зависимости проектов во все яйца, используемые экземпляром. Затем вся интроспекция IDE и кодовая навигация работают хорошо. Перейти к определению, примерам goto, поддержке рефакторинга и конечному поиску.

Ответ 12

OpenGrok - отличный выбор для поиска и навигации по источникам. Однако работает на Java.

Мне очень жаль, что было что-то вроде http://opengrok.plone.org/