grep --include命令在OSX Zsh中不起作用

时间:2014-06-13 03:22:10

标签: macos grep zsh

我正在关注How do I find all files containing specific text on Linux?上的最佳答案,以便在我的项目中搜索字符串。

这是我的命令grep --include=*.rb -rnw . -e "pattern"

Zsh告诉我zsh: no matches found: --include=*.rb

似乎grep不支持--include选项。

当我输入grep --help时,它会返回

usage: grep [-abcDEFGHhIiJLlmnOoPqRSsUVvwxZ] [-A num] [-B num] [-C[num]]
    [-e pattern] [-f file] [--binary-files=value] [--color=when]
    [--context[=num]] [--directories=action] [--label] [--line-buffered]
    [--null] [pattern] [file ...]

此处没有--include

我的grep版本太旧了吗?或者我的命令有问题吗?

2 个答案:

答案 0 :(得分:12)

FreeBSD / OSX grep支持--include选项(请参阅man grep;不幸的是,命令行帮助没有&#39} ; t列出此选项),但您的问题是选项参数*.rb 未加引号

结果是你的shell zsh尝试路径名 - 展开--include=*.rb前面的,然后失败,因为当前目录中不包含名称与--include=*.rb匹配的文件 grep永远不会执行。

由于您的目的是将*.rb 未修改为grep ,因此您必须引用

grep --include='*.rb' -rnw . -e "pattern"     

答案 1 :(得分:3)

如果您的grep不支持--include,并且您不想仅为此安装GNU grep,则可以通过多种便携方式执行相同的操作。在我的头顶,尝试

find . -type f -name '*.rb' -exec grep -nw "pattern" /dev/null {} \;

find命令遍历目录(如grep -r),查找名为*.rb的文件(如--include选项),/dev/null非常有用,因为在多个文件上运行时,grep显示的输出格式略有不同。

这样效率稍低,因为它为每个文件运行单独的grep。如果速度太慢,请查看xargs(如果find -exec ... {} \+支持,请... {} \;代替find。这是一项非常常见的任务;你应该很容易找到成千上万的例子。

您可能还想考虑ack,这是一种受欢迎且更加用户友好的选择。它是自包含的,因此“安装”相当于将其复制到$HOME/bin

相关问题