Ls命令KornShell

时间:2013-05-27 12:43:09

标签: shell unix grep ksh

我有一个名为.dir的文件夹。当我输入ls -al | grep .dir时,它会找到它并向我显示结果,但是当我输入ls -al | grep *dir或(*i**d*)时,它什么也没有显示。我无法理解为什么它找不到任何匹配。

2 个答案:

答案 0 :(得分:4)

当你做grep *dir时,可能会发生两件事:

  1. 如果有任何以dir结尾的非隐藏文件(例如foodirbardir),则该命令将扩展为grep foodir bardir并且它不会做你期望的。此外,行为会有所不同,具体取决于只有一个文件或多个文件......

  2. 没有以dir结尾的非隐藏文件,然后*dir未展开,但在grep调用中用作正则表达式。但grep中的星号用于重复最后一次匹配任意次,并且由于没有先前的字符,因此它代表自己。结论:grep正在寻找“* dir”,字面意思。

  3. 对于第一个问题,只需使用引号。对于第二次使用.*dir.代表任何字符):

    ls -la | grep ".*dir"
    

    或者,如果您只想看到您的目录:

    ls -la | grep "\.dir"
    

    请注意,如果您没有使用.转义\,则会显示adir_dir等文件...

答案 1 :(得分:0)

  • 在传递给grep之前,未加引号的星号为expanded。这意味着如果你的目录是空的,除.dir目录外,传递给grep的字符串取决于dotglobnullglob设置的状态(在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,但不是一个没有任何内容的有效正则表达式。