当我使用它查看目录中是否有特定文件时,管道ls
的{{1}}无法正常工作
grep
但是当我使用文件globbing casper@fooserver:/home/log$ ls -ltr | grep *FOO-VOL2*
时,我得到了结果:
ls
有什么区别 - grep to pipe应该可以工作。
答案 0 :(得分:4)
在执行任何操作之前,shell会扩展*FOO-VOL2*
glob,因此您运行的实际命令是:
ls -ltr |
grep FOO-VOL2.20140924.log.gz FOO-VOL2.20140925.log.gz FOO-VOL2.sessiondump.log \
FOO-VOL2.20140926.log FOO-VOL2.20140929.log FOO-VOL2.sys.log
使用这些参数运行时,grep
会忽略来自ls
的标准输入,并在文件FOO-VOL2.20140925.log.gz
,FOO-VOL2.sessiondump.log
,FOO-VOL2.20140926.log
内搜索,
FOO-VOL2.20140929.log
和FOO-VOL2.sys.log
为字符串" FOO-VOL2.20140924.log.gz"。并没有找到它,这可能不是一个惊喜。
此外,grep
正则表达式和shell glob模式是不同的。您传递给grep
的模式没有固定,因此您不需要在您正在寻找的字符串两侧等效*
。但如果你这样做,*
并不意味着"任何角色"无论如何;它表示" 0或更多的前一个字符"。因此,作为grep
表达式,*FOO-VOL2*
甚至无效。您只需要FOO-VOL2
或者作为glob中的字面翻译,即使它包含了此处不需要的部分,'.*FOO-VOL2.*'
。