确认未命中结果(与grep相比)

确认未命中结果(与grep相比),grep,ack,Grep,Ack,我肯定我对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 lo

我肯定我对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$

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

引用手册页中的内容:

在没有文件选择的情况下,
ack grep
只搜索其识别类型的文件。如果您有一个名为
foo.wango
的文件,并且
ack grep
不知道.wango文件是什么,
ack grep
将不会搜索它

(注意,我使用的是Ubuntu,由于命名冲突,二进制文件名为
ack grep

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

ack--man
说明:

如果要确认搜索每个文件, 即使是那些它总是忽略的,比如 CoreDump和备份文件,请使用 "−u形开关

为什么ack会忽略未知文件 违约ack由一个 程序员,对于程序员,对于 搜索大型代码树。最 代码库中有很多文件 哪些不是源文件(如 编译的对象文件,源代码管理 元数据等),而且grep浪费了很多 时间在所有这些中搜索 以及从 那些文件

这就是为什么阿克的行为不是 搜索它无法识别的东西 是其最大的优势之一: 从只搜索 你想看的东西


编辑:如果查看源代码,
bak
文件将被忽略。

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

您可以使用1973年的普通老grep,而不是ack。因为它显式地使用黑名单文件,而不是白名单文件类型,所以它永远不会忽略正确的结果。给出了几行配置(我在20世纪90年代在我的主目录“dotfiles”repo中创建的),grep实际上匹配或超过了ack所声称的许多优势——特别是速度:当搜索同一组文件时,grep比ack更快

让我高兴的grep配置在my.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_选项更可取,因为GREP_选项会导致登录shell中的所有GREP执行行为不同,包括您运行的程序调用的那些。这些程序可能会对grep出人意料的不同行为感到厌烦


我的新函数“grp”和“grpy”故意不给“grep”加阴影,这样我就可以在需要时随时使用原始行为。

很有趣,谢谢!没有意识到他们在中硬编码了。bak ignore.ack专门针对“在源代码树中查找代码”的常见情况进行了优化。在这种常见情况下,您希望忽略.bak文件。它并不打算成为一个通用的搜索工具,尽管你可以做到这一点,如果你跳过了障碍。如果您需要通用工具,最好只使用grep。
-u
在ack版本2中不可用。太好了,谢谢您的帮助!对于任何感兴趣的人,下面的页面将为您提供有关向ack添加无法识别的文件类型(如.haml)的更多信息:ack识别的文件类型不仅仅是扩展名。它还将关注shebang线。如果有一个程序“mywhatever”启动“#!/usr/bin/perl”,ack就会知道这是一个perl程序。请注意,Ack2.0改变了这种行为。嘿,Andy。我承认我夸大了一点喜剧效果,如果这是煽动性的,我道歉。但我的方法是直接从Ack自己的“比grep更好”自我推销中得到启发的,这种推销厚颜无耻地歪曲和省略了显著的细节,以使grep看起来不好。两个人可以玩那个游戏。如果“ack”真的更好,那么它应该有助于促进诚实的比较,而不是通过误导人们放弃像grep这样完美的替代品来分裂社区。不像称ack为“大量浪费时间”那样具有煽动性()我没有任何地方可以“误导”或“让grep看起来不好”。如果我有,给我指一下,这样我就能修好它。我希望人们尽可能使用最好的工具。很多时候,包括在这里,我告诉人们“在这种情况下不要使用ack,使用grep。”我完全支持比较:。如果你有输入re:那一页,我欢迎。我不认为这是一场游戏。我只想挥舞旗帜,告诉大家除了grep还有其他选择。好吧,我屈服了,我为我说的那些卑鄙的话感到难过。但我如此暴躁的原因是,上次我读到它时,“BetterChangRep”主页曾列出类似“使用ack代替grep的10个原因”,这是非常误导的,因为grep也做了列表上的许多事情。我看到这个列表现在的标题是“使用ack的10个原因”,这有点让人感到安慰,但我仍然知道有人将它误解为“grep不做的事情”。关于“更多工具”页面,我给出的反馈是,它可以包含grep作为替代方案,也许有几行……建议如何在.bashrc中配置包装函数以设置一些默认值,例如“-rI--color--exclude dir=\.git--exclude=tags”。当你声称“ack是快的”时,也许值得一提的是,正确配置为跳过相同的文件,grep(上次我测量它)实际上更快。谢谢你的理性,尽管我很刻薄。你有时间/倾向于写些更好的东西吗 --type-add=ruby=.haml,.rake --type-add=css=.less
# 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 "$@"
}