我正在关注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版本太旧了吗?或者我的命令有问题吗?
答案 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
。