我在目录中有三个文件:
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
的内容?
答案 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了解这种情况发生的原因。