O que o asterisco (*) faz no grep -nri “searchString” *?

4

Normalmente, durante a pesquisa usando o grep, o comando que eu estava usando era o seguinte:

grep -nri "String"

enquanto a maioria dos meus colegas faz isso:

grep -nri "String" *

O que o último faz (a parte * )?

    
por Vishaal Shankar 27.04.2018 / 12:39

1 resposta

8

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.

    
por muru 27.04.2018 / 12:51