1

我在一个目录中有三个文件:

一个.html

<html>
    a    
</html>

b.html

<html>
    b
</html>

html文件

这只是一个html文件

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

ls|grep -v *html

但结果是:

<html>
    b
</html>

为什么?

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

4

4 回答 4

4

由于您没有*html加引号,shell 将您的命令扩展为

ls | grep -v a.html b.html

现在,由于grep使用两个参数调用,它将忽略标准输入。所以结果等价于

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)
于 2012-06-15T04:08:49.223 回答
2

利用

ls | grep -v .html

这将过滤掉带有.html扩展名的名称。

快速测试

$ ls
a.html  b.html  htmlfile

$ ls | grep -v .html
htmlfile
于 2012-06-15T03:34:46.687 回答
1

这应该可以解决问题:

ls -1 | grep -v '.html$'
于 2012-06-15T03:37:39.460 回答
0

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

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

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

要更清楚地了解它是如何工作的,请向上移动一个目录并发出:

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

编辑:请参阅Pumbaa80 的回答了解为什么会发生这种情况。

于 2012-06-15T04:30:21.600 回答