2

我有一个名为.dir. 当我输入ls -al | grep .dir时,它会找到它并向我显示结果,但是当我输入ls -al | grep *dir或 ( *i*, *d*) 时,它什么也不显示。我不明白为什么它找不到任何匹配项。

4

2 回答 2

4

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

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

  2. 没有以 结尾的非隐藏文件dir, then*dir不展开,而是用作 grep 调用中的正则表达式。但是 grep 中的星号用于多次重复最后一次匹配,并且由于没有前一个字符,它代表它自己。结论: grep 从字面上看是在寻找“*dir”。

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

ls -la | grep ".*dir"

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

ls -la | grep "\.dir"

请注意,如果您不.使用 a转义它,\它还会显示文件,例如adir, _dir...

于 2013-05-27T12:49:00.283 回答
0
  • 未加引号的星号传递给grep. 这意味着如果您的目录除目录外为空.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适用于正则表达式,而不是glob*是一个有效的 glob,但不是一个有效的正则表达式,前面没有任何内容。

于 2013-05-27T12:57:18.257 回答