加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

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

发布时间:2020-12-14 00:30:34 所属栏目:Linux 来源:网络整理
导读:我正在寻找当前目录和所有子目录中包含字符串“abc”的文件: grep abc **/*(.) 输出包含如下行: ...Binary file test.pdf matches... 是否可以在glob限定符中排除二进制文件? 编辑:这里使用grep只是一个例子.我有兴趣通过zsh globbing限定符排除二进制文
我正在寻找当前目录和所有子目录中包含字符串“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无法选择基于文件的文件.

在使用globbing时,Zsh不会读取文件的内容,因此它可以使用可用的文件系统元数据.

因此,如果zsh实现了这个功能,那么整合时间将比目前可用的通用时间慢得多(当然,除非文件系统实现了“标记”二进制文件的方式,否则IMO不太可能).

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读