【发布时间】:2013-05-22 07:53:27
【问题描述】:
我有一个名为 .dir 的文件夹。当我输入 ls -al | grep .dir 时,它会找到它并向我显示结果,但是当我输入 ls -al | grep *dir 或 (*i*, *d*) 时,它什么也没有显示。我不明白为什么它找不到任何匹配项。
【问题讨论】:
我有一个名为 .dir 的文件夹。当我输入 ls -al | grep .dir 时,它会找到它并向我显示结果,但是当我输入 ls -al | grep *dir 或 (*i*, *d*) 时,它什么也没有显示。我不明白为什么它找不到任何匹配项。
【问题讨论】:
当您执行grep *dir 时,可能会发生两件事:
没有以dir 结尾的非隐藏文件,则*dir 不展开而是用作grep 调用中的正则表达式。但是 grep 中的星号用于多次重复最后一次匹配,并且由于没有前一个字符,它代表它自己。结论:grep 正在寻找“*dir”,字面意思。
对于第一个问题,只需使用引号。第二次使用.*dir(.代表任意字符):
ls -la | grep ".*dir"
或者,如果您只想查看您的目录:
ls -la | grep "\.dir"
请注意,如果您不使用\ 转义.,它还会显示adir、_dir 等文件...
【讨论】:
在传递给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,但不是一个有效的正则表达式,前面没有任何内容。
【讨论】: