使用 ack 搜索所有文件

Tyi*_*ilo 14 ack

如何使用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
Run Code Online (Sandbox Code Playgroud)

Gil*_*il' 14

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

确认 1

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

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

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

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

确认 2

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

ack --type-set='all:match:.*' -k foo
Run Code Online (Sandbox Code Playgroud)

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

  • 奇怪的是,我有一个缩小的 js 文件,即使是那个特殊的匹配所有类型的类型集也找不到...... (3认同)

小智 6

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

我相信旧的 Ack 版本会在您将--binary标志传递给二进制文件时搜索二进制文件。不过这个标志已经被移除了。您或许可以改用 grep。

grep -ar 'foo' .
Run Code Online (Sandbox Code Playgroud)