grep -nri "searchString" * 中的星号 (*) 起什么作用?

grep -nri "searchString" * 中的星号 (*) 起什么作用?

通常使用 grep 搜索时,我使用的命令是:

grep -nri "String"

而我的大多数同事都是这样做的:

grep -nri "String" *

后者起什么作用(*部分)?

答案1

grep使用该-r标志对指定目录中的所有文件进行递归操作:

-r, --recursive
      Read all files  under  each  directory,  recursively,  following
      symbolic  links only if they are on the command line.  Note that
      if  no  file  operand  is  given,  grep  searches  the   working
      directory.  This is equivalent to the -d recurse option.

默认情况下,如果没有给出目录,grep则将处理当前目录中的所有文件。

然后,在 中grep -r ... *,shell 会扩展*到当前目录中的所有文件和目录(通常以 开头的文件和目录除外.),grep然后递归地处理他们

因此,如果您有一个包含以下内容的目录:

.git/
.gitignore
foo/
foo/.foo2
foo/link2 -> /foo2/bar2
bar
link1 -> /foo/bar

其中以 结尾的名称/是目录,那么grep -r也会处理.gitignore文件和 中的所有内容.git,但grep -r ... *会扩展为grep -r ... foo bar,并且最终会排除.gitignore.git(但会包括foo/.foo2)。

还要注意关于符号链接的要点 - 如果 的扩展中的某个文件*是符号链接,则使用 时将处理符号链接目标*。因此*/foo/bar将被处理为 的目标link1,但不会/foo2/bar2作为 的目标处理link2

整体效果:

                                 w/o *           with *
.git/                              +                -
.gitignore                         +                -
foo/                               +                +
foo/.foo2                          +                +
foo/link2 -> /foo2/bar2            -                -
bar                                +                +
link1 -> /foo/bar                  -                +

当然,您想要做什么取决于您是否希望将这些文件和目录包含在搜索中;但我倾向于使用/和其他选项grep来执行排除和包含操作。--exclude--include

相关内容