shell grep排除文件名模式

zzzyeukh  于 2023-05-18  发布在  Shell
关注(0)|答案(6)|浏览(213)

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

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

我看到很多来自 *.cmd文件的grepped行。
看来排除选项对我不起作用
怎么了?
我当然可以做一些

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

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

n9vozmp4

n9vozmp41#

你可以引用模式:

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

PS../是当前目录

t9aqgxwy

t9aqgxwy2#

使用.而不是*作为路径规范。

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

l2osamch3#

你也可以这样做

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

bwntbbo34#

我看到很多来自 *.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

my系统上(其中nullglob未设置),执行以下命令:

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

被shell扩展(“理解”)为:

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

也就是说,我将 * 递归 -r)搜索字符串skim,它以f.cmdg.shsub开头,但排除与模式'. cmd'匹配的任何文件。
结果是:

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

BUT如果在您的环境中设置了选项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 模式时(即:包含*?或更多特殊字符),它将其与匹配的文件展开。* 但是 * 如果没有匹配的文件,它要么让模式作为它(如果nullglobnot 设置),要么替换为“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
uajslkp6

uajslkp65#

如果您想排除某些要grep的文件,您应该使用-l选项。

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

6mw9ycah6#

多个文件的最短代码(注意以'~'结尾的文件的DOT)是:

grep -lr --exclude=*.{zip,bak,~} "Hello world!" world/* (wrong code)
grep -lr --exclude=*{zip,bak,~} "Hello world!" world/* (correct code)

ChatGPT可能会为您提供错误的代码。圆点后面不像nycity.txt~中那样跟'~'

相关问题