搜索所有带有ack的文件


14

如何使用v2 搜索当前目录中的所有文件(包括二进制文件)ack

我想做的事情与做同样的事情ack 'foo' **,只是带有一个标志,所以如果我想搜索特定目录中的所有文件而不附加它,它就可以工作**


ack 'foo'和之间的区别ack 'foo' **

$ mkdir test && cd test
$ printf '\x00\x01foo1\x00' > test1
$ printf 'foo2' > test2
$ ack 'foo'
test2
1:foo2
$ ack 'foo' **
test1
1:foo1

test2
1:foo2

为什么要为此使用ack而不是grep?
安迪·莱斯特

1
@AndyLester我只是认为ack总是比更好grep。我错了 :)。
Tyilo

Answers:


6

默认情况下,Ack在当前目录下的所有非二进制文件中搜索模式。

我相信较早的Ack版本在将--binary标志传递给二进制文件时会搜索它们。该标志已被删除。您也许可以改用grep。

grep -ar 'foo' .

它与符号链接无关。它与二进制文件有关!
Tyilo

@Tyilo:我已经修改了答案。

13

当您没有将任何文件名传递给ack时,它将对内置的默认文件集进行操作,该文件集会排除无法识别的二进制文件。如果您确实传递了文件名,它将搜索您传递的所有文件。这解释了ack foo和之间的区别ack foo **

确认1

在ack 1.x中,使用该标志-a告诉ack不要跳过无法识别其类型的文件。

如果经常需要该标志,则可以创建一个别名:alias ack='ack -a'~/.bashrc或中添加该行~/.zshrc。如果设置了此别名,并且希望在ack不带该选项的情况下调用,请调用\ack(反斜杠禁用别名扩展)。脚本不受别名的影响,仅受交互式外壳程序的影响。

或者,您可以将-a选项添加到中~/.ackrc

二进制文件中的匹配项将列为“二进制文件test1匹配项”。如果不修改Ack本身(至少添加一个插件),则无法禁用此行为。

确认2

在ack 2.0中,该-a选项已被删除。相反,您可以定义一个与所有文件匹配的类型,并使用该-k选项使ack包括该类型的所有文件。请注意,文件类型以不可预测的顺序进行处理,这将导致随机处理一组二进制类型,将其作为普通类型而不是普通类型进行处理。

ack --type-set='all:match:.*' -k foo

这样,即使对于原本看起来是二进制的文件,也将打印匹配项。如上所述,您可以将这些选项添加到别名或中.ackrc


1
@Gilles,那真是偷偷摸摸。
安迪·莱斯特

@AndyLester,为什么要删除-a选项?返回中的“这是因为”实际上并不能解释为什么我无法再搜索无法识别的文件类型。
YannDìnendal

因为搜索所有无法识别的文本文件的1.x的-a行为现在是2.0中的默认设置。
安迪·莱斯特

2
很奇怪,我有一个缩小的js文件,即使是特殊的“所有匹配类型”类型集也找不到...
Izkata

因此,我在这里是因为:缩小的js文件中的文本,而ack无法解析。我以为答案就像“ add -a” ...我很失望。
卢西亚诺·范图奇
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.