grep不包括文件名模式

时间:2014-07-19 06:54:55

标签: bash shell grep

我读过 Use grep --exclude/--include syntax to not grep through certain files
但在我的CentOS6.4中,我做的时候

grep --exclude=*.cmd ckim * -r

我从* .cmd文件中看到很多有用的线条 所以似乎排除选项对我不起作用。
怎么了?
当然我可以做像

这样的事情
grep ckim \`find . -name \*.c -print\`

但我想知道为什么grep不起作用。

5 个答案:

答案 0 :(得分:31)

你可以引用模式:

grep -r --exclude="*.cmd"  "ckin" ./

PS。 ./是当前目录

答案 1 :(得分:3)

使用.作为pathspec而不是*

grep -r --exclude \*.cmd ckim .

答案 2 :(得分:1)

你也可以这样做

grep -rn ckim * | grep -v '\.cmd'

答案 3 :(得分:1)

  

我从* .cmd文件中看到很多grepped行。所以似乎排除选项对我不起作用。

有一个名为nullglob的shell选项,可以在没有匹配文件时控制shell模式的扩展。


因此,考虑到以下环境:

sh$ touch f.cmd g.sh
sh$ mkdir sub
sh$ echo ckim > sub/h.cmd
sh$ echo ckim > sub/i.cmd

我的系统上(其中nullglob未设置),以下命令:

grep --exclude=*.cmd ckim * -r

由shell扩展(“理解”):

grep --exclude=*.cmd ckim f.cmd g.sh sub -r

也就是说,我将递归地-r)搜索字符skim,从f.cmdg.sh和{{1}开始但不包括任何匹配模式'* .cmd'的文件。

结果是:

sub

但是如果在您的环境中设置了选项# nullglob is unset sh$ grep --exclude=*.cmd ckim * -r sub/i.sh:ckim ,则相同的命令会扩展为:

nullglob

注意整个 grep ckim f.cmd g.sh sub -r 是如何消失的。结果是:

--exclude=...

现在,为了解释。当shell遇到 glob 模式(即:包含# nullglob is set sh$ grep --exclude=*.cmd ckim * -r sub/i.sh:ckim sub/h.cmd:ckim *或更多特殊字符)时,它会使用匹配的文件对其进行扩展。 如果没有匹配的文件,它会让模式(如果? 设置)或者将其替换为“nothing”(如果{已设置{1}}。

这里的模式是nullglob(在整个,因为那里没有空格)。万一你有一个匹配这个模式的文件,它就会被替换掉。否则,它将“按原样”或完全删除 - 取决于nullglob


您可以轻松地显示,设置(--include=*.cmd)或取消设置(nullglob)当前bash -s选项的状态:

-u

答案 4 :(得分:0)

如果要将某些文件排除在grep之外,则应使用-l选项。

grep -l --exclude=*.cmd ckim * -r