grep排除文件名称模式

我读过使用grep --exclude / - 包括语法不通过某些文件grep
但在我的CentOS6.4中,当我这样做时

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

我看到很多来自* .cmd文件的grepped行。
所以它似乎排除选项不适合我。
哪里不对?
当然我可以做类似的事情

grep ckim `find . -name *.c -print`

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


你可以引用这个模式:

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

PS。 ./是当前目录


使用. 作为pathspec而不是*

grep -r --exclude *.cmd ckim .

我看到很多来自* .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 )搜索以f.cmdg.shsub开头的字符串skim ,但排除任何匹配模式'* .cmd'的文件。

结果是:

# nullglob is unset
sh$ grep --exclude=*.cmd ckim * -r
sub/i.sh:ckim

但是,如果在您的环境中设置了选项nullglob ,则相同的命令将展开为:

grep ckim f.cmd g.sh sub -r

注意整个 - --exclude=...已经消失了。 结果是:

# nullglob is set
sh$ grep --exclude=*.cmd ckim * -r
sub/i.sh:ckim
sub/h.cmd:ckim

一个现在,为解释。 当shell遇到一个glob模式(即:包含*?或多个特殊字符)时,它会用匹配的文件扩展它。 但是,如果没有匹配的文件,它可以让模式为nullglob (如果nullglob未设置)或将其替换为“nothing”(如果设置了nullglob )。

这里的模式是--include=*.cmd (整体,因为里面没有空格)。 万一你有一个匹配这个模式的文件,它将被替换。 否则,它可以让它“随它”或完全移除 - 取决于nullglob


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

sh$ shopt nullglob
nullglob        on

sh$ shopt -u nullglob
sh$ shopt nullglob
nullglob        off

sh$ shopt -s nullglob
sh$ shopt nullglob
nullglob        on
链接地址: http://www.djcxy.com/p/47245.html

上一篇: grep excluding file name pattern

下一篇: How do you exclude a specific file from ack (ack