包含命令在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 。
