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.cmd
, g.sh
和sub
开头的字符串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