包含命令在OSX Zsh中不起作用
我正在关注如何在Linux上查找包含特定文本的所有文件? 在我的项目中搜索字符串。
这是我的命令grep --include=*.rb -rnw . -e "pattern"
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版本太旧了吗? 或者我的命令有问题吗?
FreeBSD / OSX grep
DOES支持--include
选项(请参阅man grep
;不幸的是,命令行帮助不会列出此选项),但问题在于选项参数*.rb
未加引号 。
因此,它是您的shell zsh
尝试将路径名展开为--include=*.rb
,并且失败,因为当前目录不包含名称与--include=*.rb
匹配的--include=*.rb
。
grep
甚至不会执行。
由于您的意图是将*.rb
未修改为grep
,因此您必须引用它 :
grep --include='*.rb' -rnw . -e "pattern"
如果你的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
。