ls管道grep vs ls文件glob

时间:2014-10-02 16:31:23

标签: bash grep ls

当我使用它查看目录中是否有特定文件时,管道ls的{​​{1}}无法正常工作

grep

但是当我使用文件globbing casper@fooserver:/home/log$ ls -ltr | grep *FOO-VOL2* 时,我得到了结果:

ls

有什么区别 - grep to pipe应该可以工作。

1 个答案:

答案 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.gzFOO-VOL2.sessiondump.logFOO-VOL2.20140926.log内搜索, FOO-VOL2.20140929.logFOO-VOL2.sys.log为字符串" FOO-VOL2.20140924.log.gz"。并没有找到它,这可能不是一个惊喜。

此外,grep正则表达式和shell glob模式是不同的。您传递给grep的模式没有固定,因此您不需要在您正在寻找的字符串两侧等效*。但如果你这样做,*并不意味着"任何角色"无论如何;它表示" 0或更多的前一个字符"。因此,作为grep表达式,*FOO-VOL2*甚至无效。您只需要FOO-VOL2或者作为glob中的字面翻译,即使它包含了此处不需要的部分,'.*FOO-VOL2.*'