如果命令由*参数化,grep -R是否只能工作?

时间:2012-02-11 18:49:51

标签: grep

非常奇怪的情况。看看这个:

billy@prog:~/sql$ grep -R temp_exchange *.sp
billy@prog:~/sql$ grep -R temp_exchange *
events/sumup_events_by_exchange.sp:drop table if exists temp_exchange;
events/sumup_events_by_exchange.sp:create temporary table temp_exchange

所以 - 第一个grep没有回来,但第二个grep做了。因此 - 第一个grep应该返回一些东西,因为搜索到的字符串位于以.sp结尾的文件中(在第一个命令中指定)。

所以我不想用*参数化这个命令,因为这似乎是一个不好习惯。

任何其他方式,我可以做我想要的没有*?

TIA!

2 个答案:

答案 0 :(得分:1)

grep -R --include=*.sp temp_exchange *

最后一个参数(在本例中为*)告诉grep要搜索的文件和目录 这将导致grep搜索包含与模式匹配的所有顶级文件的文件列表,以及(在递归模式下)目录中的所有文件。

在这些目录中,您可以使用--include选项指定特定的文件模式。

来自http://ss64.com/bash/grep.html

 -R
 -r
 --recursive
   Read all files under each directory, recursively; this is equivalent to the -d recurse option. 
 --include=PATTERN
   Recurse in directories only searching file matching PATTERN. 
 --exclude=PATTERN
   Recurse in directories skip file matching PATTERN.

答案 1 :(得分:0)

因为* .sp在当前文件夹中是通配符。所以它最终会查找当前文件夹中所有文件和文件夹.sp。

执行ls *.sp以查看您传递给命令的内容。它在你的例子中做了正确的事情。

您可能希望使用find

执行find . | grep "\.sp$" | xargs grep temp_exchange或类似的变体