Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash ls管道到grep vs ls文件全局_Bash_Grep_Ls - Fatal编程技术网

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
的行。