23

我正在开发一个大量使用鸡蛋的 Python 程序(Plone)。这意味着有 198 个目录充满了我在调试时可能想要搜索的 Python 代码。有没有一种好方法可以只搜索那些目录中的 .py 文件,避免不相关的代码和大型二进制文件?

4

12 回答 12

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

顺便说一句,自从写了这篇文章后,我发现了ack,这是一个更好的解决方案。

(自那次编辑以来,我发现了 ag)。

于 2009-05-14T20:00:33.133 回答
20
grep -r -n "PATTERN" --include="*.py" DIRECTORY
于 2009-05-14T20:04:37.147 回答
19

我强烈推荐ack,一个 grep 替代品,“针对拥有大量异构源代码树的程序员”(来自网站)

于 2009-05-14T20:15:21.257 回答
7

这些天我也经常使用ack。我确实对其进行了一些调整以找到所有相关的文件类型:

# 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/find 所有相关文件?

于 2009-06-16T14:43:24.463 回答
4
find <directory> -name '*.py' -exec grep <pattern> {} \;
于 2009-05-14T20:04:42.203 回答
4

这个问题是创建collective.recipe.omelette 的动机。这是一个构建配方,可以将您工作集中的所有鸡蛋符号链接到一个目录结构中,您可以将您最喜欢的搜索实用程序指向该目录结构。

于 2011-02-27T05:00:22.757 回答
2

如果您想非常快速地在大型源代码树中查找标识符,还有GNU idutils 。它需要通过运行 mkid(并调整其配置文件以不忽略 .py 文件)提前构建搜索数据库。 如果您使用 buildout,z3c.recipe.tag会处理这个问题。

于 2009-09-17T20:59:42.150 回答
2

以防万一您需要非命令行 OSS 解决方案...

我使用pycharm。它内置了对构建的支持。您将它指向一个构建生成的 bin/instance,它将项目外部依赖项设置为实例使用的所有鸡蛋。然后所有 IDE 的自省和代码导航都可以很好地工作。Goto 定义、goto 实例、重构支持,当然还有搜索。

于 2011-02-27T04:21:08.687 回答
2

我建议在使用 plone 和 pydev 功能“全局浏览器”(使用 eclipse 或 aptana studio)时搜索煎蛋。

于 2011-02-28T09:19:30.607 回答
2

仅仅因为没有足够的答案......

如果您正在常规开发,那么使用 Pydev 安装 Eclipse(或者更简单,Aptana Studio - 这是一个修改后的 Eclipse)是非常值得的,在这种情况下,查找工具就在那里。

于 2011-03-04T03:56:29.540 回答
2

OpenGrok 是源搜索和导航的绝佳选择。不过可以在 Java 上运行。

我真的希望有像https://oracle.github.io/opengrok/这样的东西

于 2011-03-07T21:01:53.793 回答
1

自从发现 Emacs 的 rgrep 命令后,我的 grepping 生活变得更加令人满意。

假设我想在 Plone 的源代码中找到“IPortletDataProvider”。我愿意:

  1. M-x rgrep
  2. Emacs 提示输入搜索字符串 (IPortletDataProvider)
  3. ...然后搜索哪些文件 (*.py)
  4. ...然后是哪个目录(~/Plone/buildout-cache/eggs)。如果我已经在编辑文件,则默认为该文件的目录,这通常正是我想要的。

结果出现在一个新的缓冲区中。顶部是find | xargs grepEmacs 运行的命令。所有匹配都会突出显示。我可以使用标准文本搜索命令搜索缓冲区。最重要的是,我可以在匹配项上按 Enter(或单击)以打开该文件。

这是一种非常好的工作方式。我喜欢我不必记住find | xargs grep参数序列,但如果我需要它,所有的力量都在那里。

Emacs rgrep 示例

于 2011-02-27T00:03:30.027 回答