gpt4 book ai didi

zsh glob 限定符排除二进制文件

转载 作者:行者123 更新时间:2023-12-04 23:01:20 26 4
gpt4 key购买 nike

我在当前目录和所有子目录中寻找包含字符串“abc”的文件:

grep abc **/*(.)

输出包含以下行:
...
Binary file test.pdf matches
...

是否可以在 glob 限定符中排除二进制文件?

编辑 : 使用 grep这里只是一个例子。我有兴趣通过 zsh globbing 限定符来排除二进制文件,而不是在适当的 grep 选项中。

最佳答案

消息“二进制文件 test.pdf 匹配”不是由 zsh 打印的,而是由 grep 本身打印的。

原因是大多数时候,如果您要打印包含该模式的二进制文件的行,它也会打印“垃圾”(即不可打印的字符、非常长的行等)。

在您的示例中 **/*(.) 是 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
(...)

请注意,虽然手册说“纯文本文件”,但并不意味着“纯文本文件”。
这意味着常规文件。

AFAIK,zsh 无法选择基于文件内容是否为二进制文件的 glob 文件。

Zsh 在 globbing 时不读取文件的内容,而是使用可用的文件系统元数据。

因此,如果 zsh 实现此功能,则通配时间将比当前可用的通配时间慢得多(当然,除非文件系统实现了一种“标记”二进制文件的方法,IMO 不太可能这样做)。

您可以尝试使用执行标志过滤掉文件,但这会非常不精确(即,可执行脚本会退出,而非可执行二进制文件会进入)。

此任务更适合 grep 本身,因为无论如何他都会读取文件。

关于zsh glob 限定符排除二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23407799/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com