当我用它来查看目录中是否有特定文件时,通过管道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 到管道应该可以工作。
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.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-VOL2or,作为 glob 的直译,即使它包含此处不需要的部分'.*FOO-VOL2.*'。