grep com o -r flag opera em todos os arquivos nos diretórios especificados recursivamente:
-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.
Por padrão, se nenhum diretório for fornecido, grep processará todos os arquivos no diretório atual.
Em grep -r ... * , o shell expande * para todos os arquivos e diretórios no diretório atual (geralmente, exceto aqueles que começam com . ), e grep funciona recursivamente em eles .
Então, se você tivesse um diretório que contivesse, por exemplo:
.git/
.gitignore
foo/
foo/.foo2
foo/link2 -> /foo2/bar2
bar
link1 -> /foo/bar
em que os nomes terminados em / são diretórios, então grep -r também processaria o arquivo .gitignore e tudo em .git , mas grep -r ... * iria para grep -r ... foo bar e acabaria excluindo .gitignore e .git (mas incluiria foo/.foo2 ).
Observe também o ponto sobre links simbólicos - se um dos arquivos na expansão de * fosse um link simbólico, o destino do symlink seria processado se você usasse * . Assim, com * , /foo/bar será processado como o destino de link1 , mas não /foo2/bar2 como o destino de link2 .
O efeito geral:
w/o * with *
.git/ + -
.gitignore + -
foo/ + +
foo/.foo2 + +
foo/link2 -> /foo2/bar2 - -
bar + +
link1 -> /foo/bar - +
O que você quer fazer, é claro, depende se você deseja que esses arquivos e diretórios sejam incluídos na pesquisa; mas tenho a tendência de preferir que o próprio grep faça o excludente e inclua o uso de --exclude / --include e outras opções.