Bash ls管道到grep vs ls文件全局
当我使用此命令查看目录中是否有特定文件时,Bash ls管道到grep vs ls文件全局,bash,grep,ls,Bash,Grep,Ls,当我使用此命令查看目录中是否有特定文件时,ls管道传输到grep不起作用 casper@fooserver:/home/log$ ls -ltr | grep *FOO-VOL2* 但是当我将ls与文件globbing一起使用时,我会得到以下结果: casper@fooserver:/home/log$ ls -ltr *FOO-VOL2* -rw-rw-rw- 1 casper casper 11489 Sep 24 18:00 FOO-VOL2.20140924.log.gz -
ls
管道传输到grep
不起作用
casper@fooserver:/home/log$ ls -ltr | grep *FOO-VOL2*
但是当我将ls
与文件globbing一起使用时,我会得到以下结果:
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
区别是什么-grep-to管道应该可以工作。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.gz
,FOO-VOL2.sessiondump.log
,FOO-VOL2.20140926.log
,,
FOO-VOL2.20140929.log
,以及字符串“FOO-VOL2.20140924.log.gz”的FOO-VOL2.sys.log
。但没有找到,这可能并不奇怪
而且,
grep
正则表达式和shell glob模式是不同的。您传递给grep
的模式没有被锚定,因此您不需要在您要查找的字符串的任一侧使用等价的*
。但是如果你这样做了,*
并不意味着“任何字符”;它的意思是“前一个字符的0或更多”。因此,作为一个grep
表达式,*FOO-VOL2*
甚至是无效的。您只需要FOO-VOL2
或者,作为glob的直译,即使它包含此处不需要的部分,.*FOO-VOL2.*'
在执行任何操作之前,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.gz
,FOO-VOL2.sessiondump.log
,FOO-VOL2.20140926.log
,,
FOO-VOL2.20140929.log
,以及字符串“FOO-VOL2.20140924.log.gz”的FOO-VOL2.sys.log
。但没有找到,这可能并不奇怪
而且,grep
正则表达式和shell glob模式是不同的。您传递给grep
的模式没有被锚定,因此您不需要在您要查找的字符串的任一侧使用等价的*
。但是如果你这样做了,*
并不意味着“任何字符”;它的意思是“前一个字符的0或更多”。因此,作为一个grep
表达式,*FOO-VOL2*
甚至是无效的。您只需要FOO-VOL2
,或者,作为glob的直译,即使它包含此处不需要的部分,.*FOO-VOL2.*.
在与*FOO-VOL2*
匹配的文件名包含换行符的情况下,情况非常不同;ls
的输出将跨越多行,grep
(假设正则表达式正确)将只显示包含FOO-VOL2
的行。在与*FOO-VOL2*
匹配的文件名包含新行的情况下,这两种情况非常不同;ls
的输出将跨越多行,grep
(假设正则表达式正确)将只显示包含FOO-VOL2
的行。