2014-10-02 69 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.*'