我确定我对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$
Run Code Online (Sandbox Code Playgroud)
而...
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' } %>
Run Code Online (Sandbox Code Playgroud)
简单地在ack没有选项的情况下调用无法在.bak文件中找到结果,但使用该--unrestricted选项调用可以找到结果.据我所知,ack .bak默认不会忽略文件.
UPDATE
感谢下面的有用评论,以下是我的新内容~/.ackrc:
--type-add=ruby=.haml,.rake --type-add=css=.less
Joa*_*uer 52
ack它的特殊之处在于它没有要忽略的文件类型的黑名单,而是它将搜索的文件类型的白名单.
引用手册页:
没有文件选择,
ack-grep只搜索它识别的类型的文件.如果您有一个名为的文件foo.wango,并且ack-grep不知道.wango文件是什么,ack-grep则不会搜索它.
(注意我正在使用Ubuntu,ack-grep因为命名冲突而调用二进制文件)
ack --help-types 将显示您的ack安装支持的类型列表.
nev*_*219 12
ack --man 状态:
如果你想要ack搜索每个文件,即使它总是忽略像coredumps和备份文件,请使用"-u"开关.
和
为什么ack默认忽略未知文件?ack是由程序员为程序员设计的,用于搜索大量的代码树.大多数代码库中都有很多文件,这些文件不是源文件(如编译对象文件,源代码控制元数据等),grep浪费了大量时间搜索所有这些文件并从这些文件返回匹配项.
这就是为什么ack不搜索它不能识别的东西的行为是它最大的优势之一:你只需搜索你想要看的东西就能获得的速度.
编辑:此外,如果您查看源代码,bak文件将被忽略.
从1973年开始,您可以使用普通的旧grep,而不是与ack进行摔跤.因为它使用明确列入黑名单的文件,而不是白名单文件类型,因此它永远不会遗漏正确的结果.给定了几行配置(我在20世纪90年代在我的主目录'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 "$@"
}
Run Code Online (Sandbox Code Playgroud)
要忽略的文件和目录的确切列表可能会有所不同:我主要是Python开发人员,这些设置对我有用.
添加子自定义也很容易,正如我为我的'grpy'所示,我用来grep Python源代码.
定义像这样的bash函数比设置GREP_OPTIONS更好,这将导致来自登录shell的grep的所有执行行为不同,包括由您运行的程序调用的那些.这些程序可能会对grep的意外不同行为进行调查.
我的新功能'grp'和'grpy'故意不影响'grep',所以我仍然可以在任何需要的时候使用原始行为.