ls 管道到 grep 与 ls 文件 glob

cap*_*ser 0 bash grep ls

当我用它来查看目录中是否有特定文件时,通过管道ls传送到grep不起作用

 casper@fooserver:/home/log$ ls -ltr | grep  *FOO-VOL2*
Run Code Online (Sandbox Code Playgroud)

但是当我使用ls文件通配符时,我得到结果:

casper@fooserver:/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
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*eed 5

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
Run Code Online (Sandbox Code Playgroud)

当使用这些参数运行时,grep忽略来自它的标准输入ls,并在文件FOO-VOL2.20140925.log.gzFOO-VOL2.sessiondump.logFOO-VOL2.20140926.logFOO-VOL2.20140929.logFOO-VOL2.sys.log中搜索字符串“FOO-VOL2.20140924.log.gz”。并且没有找到它,这可能并不奇怪。

此外,grep正则表达式和 shell glob 模式也不同。您传递给的模式grep没有锚定,因此您不需要*在要查找的字符串的任一侧进行等效操作。但如果你这样做了,*并不意味着“任何角色”;它的意思是“0个或多个前一个字符”。所以作为一个grep表达,*FOO-VOL2*甚至是无效的。您想要的只是FOO-VOL2or,作为 glob 的直译,即使它包含此处不需要的部分'.*FOO-VOL2.*'