我正在开发一个大量使用鸡蛋的 Python 程序(Plone)。这意味着有 198 个目录充满了我在调试时可能想要搜索的 Python 代码。有没有一种好方法可以只搜索那些目录中的 .py 文件,避免不相关的代码和大型二进制文件?
12 回答
find DIRECTORY -name "*.py" | xargs grep PATTERN
顺便说一句,自从写了这篇文章后,我发现了ack,这是一个更好的解决方案。
(自那次编辑以来,我发现了 ag)。
grep -r -n "PATTERN" --include="*.py" DIRECTORY
我强烈推荐ack,一个 grep 替代品,“针对拥有大量异构源代码树的程序员”(来自网站)
这些天我也经常使用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 所有相关文件?
find <directory> -name '*.py' -exec grep <pattern> {} \;
这个问题是创建collective.recipe.omelette 的动机。这是一个构建配方,可以将您工作集中的所有鸡蛋符号链接到一个目录结构中,您可以将您最喜欢的搜索实用程序指向该目录结构。
如果您想非常快速地在大型源代码树中查找标识符,还有GNU idutils 。它需要通过运行 mkid(并调整其配置文件以不忽略 .py 文件)提前构建搜索数据库。 如果您使用 buildout,z3c.recipe.tag会处理这个问题。
以防万一您需要非命令行 OSS 解决方案...
我使用pycharm。它内置了对构建的支持。您将它指向一个构建生成的 bin/instance,它将项目外部依赖项设置为实例使用的所有鸡蛋。然后所有 IDE 的自省和代码导航都可以很好地工作。Goto 定义、goto 实例、重构支持,当然还有搜索。
仅仅因为没有足够的答案......
如果您正在常规开发,那么使用 Pydev 安装 Eclipse(或者更简单,Aptana Studio - 这是一个修改后的 Eclipse)是非常值得的,在这种情况下,查找工具就在那里。
OpenGrok 是源搜索和导航的绝佳选择。不过可以在 Java 上运行。
自从发现 Emacs 的 rgrep 命令后,我的 grepping 生活变得更加令人满意。
假设我想在 Plone 的源代码中找到“IPortletDataProvider”。我愿意:
M-x rgrep
- Emacs 提示输入搜索字符串 (IPortletDataProvider)
- ...然后搜索哪些文件 (*.py)
- ...然后是哪个目录(~/Plone/buildout-cache/eggs)。如果我已经在编辑文件,则默认为该文件的目录,这通常正是我想要的。
结果出现在一个新的缓冲区中。顶部是find | xargs grep
Emacs 运行的命令。所有匹配都会突出显示。我可以使用标准文本搜索命令搜索缓冲区。最重要的是,我可以在匹配项上按 Enter(或单击)以打开该文件。
这是一种非常好的工作方式。我喜欢我不必记住find | xargs grep
参数序列,但如果我需要它,所有的力量都在那里。