我怎样才能搜索全部当前目录中带有ack
v2 的文件(包括二进制文件)?
我想做与执行相同的操作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
答案1
当您不向 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
这样,即使对于原本看起来是二进制的文件,也会打印匹配项。如上所述,您可以将这些选项添加到别名或您的.ackrc
.
答案2
默认情况下,Ack 在当前目录下的所有非二进制文件中搜索模式。
我相信当你将标志传递给旧的 Ack 版本时,它们会搜索二进制文件--binary
。不过该标志已被删除。您也许可以使用 grep 来代替。
grep -ar 'foo' .