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.