"二进制文件test.pdf匹配"这个消息是由grep本身而不是zsh打印出来的。
原因是大多数情况下,如果您要打印包含模式的二进制文件行,它也会打印出"垃圾"(即非可打印字符、非常长的行等)。
在您的示例中,** / * (.)是zsh扩展。您可以使用echo检查其扩展内容:
$ echo **/*(.)
请注意,**/*(.)无法匹配以点开头的文件在顶级目录中。
$ mkdir test
$ cd test
$ touch .mytest
$ echo **/*(.)
zsh: no matches found: **/*(.)
如果你想要在当前目录递归地查找包含某种模式的文件,有一种非常简单的方法:
$ grep -rI .
如果您想忽略当前目录中以点开头的文件:
$ grep -r *
关于使用zsh globbing来过滤二进制文件。
这是zshexpn(1)的一部分:
A qualifier may be any one of the following:
/ directories
F `full' (i.e. non-empty) directories.
. plain files
@ symbolic links
= sockets
(...)
请注意,尽管手册上说“plain files”,但它并不是指“纯文本文件”,而是指普通文件。
据我所知,zsh没有根据文件内容是否为二进制文件来匹配的选项。
在进行globbing时,zsh不会读取文件内容,而是使用可用的文件系统元数据。
因此,如果zsh要实现此功能,则globbing时间将比当前可用的globbing慢得多(除非当然文件系统实现了一种“标记”二进制文件的方法,但我认为这是不太可能的)。
您可以尝试过滤具有执行权限的文件,但这将非常不精确(即可执行脚本会被排除在外,而非可执行二进制文件会被包括在内)。
由于grep本身将读取文件,因此此任务更适合于grep。
grep
可以识别它们,因为它实际上查看每个文件的内容;这不是一些(大多数?)文件系统跟踪的属性,而zsh
只在查找模式匹配时查看文件系统元数据。 - chepnergrep -I mc **/*(.)
可以实现我想要的功能。 - siestegrep
仅根据高位设置的字节比例进行猜测。具有许多非ASCII字母的UTF-8文件也将被解释为二进制文件。 - chepner