我读过
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不起作用。
答案 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.cmd
,g.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