46

我确定我误解了 ack 的文件/目录忽略默认值,但也许有人可以为我阐明这一点:

mbuck$ grep logout -R app/views/
Binary file app/views/shared/._header.html.erb.bak.swp matches
Binary file app/views/shared/._header.html.erb.swp matches
app/views/shared/_header.html.erb.bak: <%= link_to logout_text, logout_path, { :title => logout_text, :class => 'login-menuitem' } %>
mbuck$ ack logout app/views/
mbuck$

然而...

mbuck$ ack -u logout app/views/
Binary file app/views/shared/._header.html.erb.bak.swp matches
Binary file app/views/shared/._header.html.erb.swp matches
app/views/shared/_header.html.erb.bak
98:<%= link_to logout_text, logout_path, { :title => logout_text, :class => 'login-menuitem' } %>

简单地ack不带选项调用无法在.bak文件中找到结果,但使用--unrestricted选项调用可以找到结果。不过,据我所知, ack 默认情况下不会忽略.bak文件。

更新

感谢以下有用的评论,这里是我的新内容~/.ackrc

--type-add=ruby=.haml,.rake
--type-add=css=.less
4

4 回答 4

52

ack独特之处在于它没有要忽略的文件类型的黑名单,而是它将搜索的文件类型的白名单。

引用手册页:

没有文件选择,ack-grep只搜索它识别的类型的文件。如果您有一个名为 的文件foo.wango,并且ack-grep不知道 .wango 文件是什么,请ack-grep不要搜索它。

(请注意,我使用的是ack-grep由于命名冲突而调用二进制文件的 Ubuntu)

ack --help-types将显示您的 ack 安装支持的类型列表。

于 2010-06-14T16:33:06.163 回答
13

如果您对 ack 将搜索哪些文件感到困惑,只需添加 -f 选项。它将列出它发现可搜索的所有文件。

于 2010-06-14T19:24:36.650 回答
12

ack --man状态:

如果您想 ack 搜索每个文件,即使是它总是忽略的文件,如核心转储和备份文件,请使用“-u”开关。

为什么ack默认忽略未知文件?ack 是由程序员为程序员设计的,用于搜索大型代码树。大多数代码库中有很多不是源文件的文件(如编译的目标文件、源代码控制元数据等),而 grep 也浪费了大量时间搜索所有这些文件并从这些文件中返回匹配项。

这就是为什么 ack 不搜索它不识别的东西的行为是它最大的优势之一:只搜索你想要查看的东西所获得的速度。

编辑:此外,如果您查看源代码,bak则会忽略文件。

于 2010-06-14T16:36:29.940 回答
5

您可以使用 1973 年的普通旧 grep,而不是与 ack 搏斗。因为它使用显式列入黑名单的文件,而不是列入白名单的文件类型,所以它永远不会遗漏正确的结果。给定几行配置(我在 1990 年代在我的主目录 'dotfiles' repo 中创建),grep 实际上匹配或超过了 ack 声称的许多优势 - 特别是速度:当搜索同一组文件时,grep比ack快。

让我高兴的 grep 配置在我的 .bashrc 中如下所示:

# Custom 'grep' behaviour
# Search recursively
# Ignore binary files
# Output in pretty colors
# Exclude a bunch of files and directories by name
# (this both prevents false positives, and speeds it up)
function grp {
    grep -rI --color --exclude-dir=node_modules --exclude-dir=\.bzr --exclude-dir=\.git --exclude-dir=\.hg --exclude-dir=\.svn --exclude-dir=build --exclude-dir=dist --exclude-dir=.tox --exclude=tags "$@"
}

function grpy {
    grp --include=*.py "$@"
}

要忽略的文件和目录的确切列表对您来说可能会有所不同:我主要是 Python 开发人员,这些设置对我有用。

正如我在“grpy”中展示的那样,添加子定制也很容易,我用它来 grep Python 源代码。

像这样定义 bash 函数比设置 GREP_OPTIONS 更可取,这将导致从您的登录 shell 执行的所有 grep 执行不同的行为,包括由您运行的程序调用的那些。这些程序可能会因 grep 出乎意料的不同行为而大吵大闹。

我的新函数“grp”和“grpy”故意不隐藏“grep”,这样我仍然可以在需要时随时使用原始行为。

于 2011-10-04T11:08:49.733 回答