2014-10-02 67 views
0

,当我使用它来看看是否有目录中的特定文件,ls管道输送到grep不起作用LS管到grep VS LS文件名匹配

[email protected]:/home/log$ ls -ltr | grep *FOO-VOL2* 

但是当我使用ls与文件globbing我得到的结果:

[email protected]:/home/log$ ls -ltr *FOO-VOL2* 
-rw-rw-rw- 1 casper casper 11489 Sep 24 18:00 FOO-VOL2.20140924.log.gz 
-rw-rw-rw- 1 casper casper 11885 Sep 25 18:00 FOO-VOL2.20140925.log.gz 
-rw-rw-rw- 1 casper casper  0 Sep 26 08:00 FOO-VOL2.sessiondump.log 
-rw-rw-rw- 1 casper casper 60906 Sep 26 18:00 FOO-VOL2.20140926.log 
-rw-rw-rw- 1 casper casper 58503 Sep 29 09:00 FOO-VOL2.20140929.log 
-rw-rw-rw- 1 casper casper 8259128 Sep 29 09:00 FOO-VOL2.sys.log 

有什么区别 - grep管道应该工作。

+0

在与* FOO-VOL2 *'匹配的文件名包含换行符的转角情况下,*非常*不同; 'ls'的输出将跨越多行,'grep'(假设正确的正则表达式)将只显示包含'FOO-VOL2'的行。 – chepner 2014-10-02 18:01:43

回答

4

外壳扩展*FOO-VOL2*水珠执行任何东西之前,所以你实际运行的命令是这样的:

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.logFOO-VOL2.sys.log内的字符串“FOO-VOL2.20140924.log.gz”。并没有找到它,这可能不是一个惊喜。

另外,grep正则表达式和shell glob模式是不同的。您传递给grep的模式不会被锚定,因此您不需要在要查找的字符串的任何一边上输入相应的*。但是,如果你这样做,*反正并不意味着“任何角色”;它意味着“0个或更多的前一个字符”。因此,作为grep表达式,*FOO-VOL2*甚至不是有效的。您只需要FOO-VOL2,或者作为从glob中直接转换而来,即使它包含此处不必要的部分,'.*FOO-VOL2.*'