我有一个名为.dir
的文件夹。当我输入ls -al | grep .dir
时,它会找到它并向我显示结果,但是当我输入ls -al | grep *dir
或(*i*
,*d*
)时,它什么也没有显示。我无法理解为什么它找不到任何匹配。
答案 0 :(得分:4)
当你做grep *dir
时,可能会发生两件事:
如果有任何以dir
结尾的非隐藏文件(例如foodir
和bardir
),则该命令将扩展为grep foodir bardir
并且它不会做你期望的。此外,行为会有所不同,具体取决于只有一个文件或多个文件......
没有以dir
结尾的非隐藏文件,然后*dir
未展开,但在grep调用中用作正则表达式。但grep中的星号用于重复最后一次匹配任意次,并且由于没有先前的字符,因此它代表自己。结论:grep正在寻找“* dir”,字面意思。
对于第一个问题,只需使用引号。对于第二次使用.*dir
(.
代表任何字符):
ls -la | grep ".*dir"
或者,如果您只想看到您的目录:
ls -la | grep "\.dir"
请注意,如果您没有使用.
转义\
,则会显示adir
,_dir
等文件...
答案 1 :(得分:0)
在传递给grep
之前,未加引号的星号为expanded。这意味着如果你的目录是空的,除.dir
目录外,传递给grep
的字符串取决于dotglob
和nullglob
设置的状态(在Bash;我不喜欢不知道他们的Korn shell等价物:
$ cd -- "$(mktemp -d)"
$ mkdir .dir
$ shopt -u dotglob nullglob
$ echo *dir
*dir
$ shopt -s nullglob
$ echo *dir
$ shopt -s dotglob
$ echo *dir
.dir
grep
适用于regular expressions,而非globs。 *
是一个有效的glob,但不是一个没有任何内容的有效正则表达式。