grep:grep -v排除文件但不起作用

时间:2012-06-15 03:31:44

标签: linux grep

我在目录中有三个文件:

a.html

<html>
    a    
</html>

b.html

<html>
    b
</html>

HTMLFILE

this is just a html file

我想获取文件扩展名不是.html的文件,所以我使用的命令是:

ls|grep -v *html

但结果是:

<html>
    b
</html>

为什么?

谢谢。但我不知道为什么ls|grep -v *html打印出b.html的内容。如果此命令打印出以.html结尾的文件内容,为什么不打印出a.html的内容?

4 个答案:

答案 0 :(得分:4)

由于您未将*html放在引号中,因此shell会将您的命令扩展为

ls | grep -v a.html b.html

现在,由于使用两个参数调用grep,它将忽略stdin。所以结果相当于

grep -v "a.html" b.html

打印b.html

的内容

修改

要使其正常工作,请使用

ls | grep -v "html$"
# Note that html$ is the regexp equivalent to the shell pattern *html

shopt -s extglob # turn on extended globbing
ls -d !(*html)

答案 1 :(得分:2)

使用

ls | grep -v .html

这会过滤掉.html分机的名称。

快速测试

$ ls
a.html  b.html  htmlfile

$ ls | grep -v .html
htmlfile

答案 2 :(得分:1)

这应该可以解决问题:

ls -1 | grep -v '.html$'

答案 3 :(得分:0)

这与shell globbing有关。我不确定为什么grep -v会这样做,但是在Arch Linux zsh上有一些类似的结果:

ls | grep -v *html
    <html>b</html>
grep -v *html
    <html>b</html>

注意那些结果相同。 grep命令在当前工作目录上运行,并使用shell globbing字符(*)作为参数。来自ls的管道与它无关。它包含在输出中,但grep丢弃它。

要更清楚地了解其工作原理,请向上移动目录并发出:

ls <dirname> | grep -v *html
    zsh: no matches found: *html

修改:请参阅Pumbaa80's answer了解这种情况发生的原因。