"Grep -r foo *" vs "grep -r foo".

10

Ao usar grep -r, você pode procurar em todos os arquivos com * ou. e parece retornar a mesma coisa, mas é realmente a mesma coisa?

Digamos que eu pesquise "foo", então eu poderia escrever

grep -r foo *

ou

grep -r foo .

Alguém tentaria explicar a diferença entre. e *?

Johan
fonte

Respostas:

15

grep -r foo *não procura correspondências em arquivos ou diretórios ocultos, também *é expandido pelo shell, para que você possa acabar com um erro muito longo da lista Argument quando houver muitas entradas no diretório atual ou outros erros ou mau comportamento, se o O nome de alguns dos arquivos ou diretórios começa com um caractere de hífen.

A invocação grep -r foo .não possui as falhas acima

Atualizada:

Outra diferença: a página de manual do grep (@ fedora17) diz:

-r, --recursive
    Read all files under each directory, recursively, following symbolic links only if they
    are on  the  command  line.  ...

Também haverá uma diferença quando você executar este comando em um diretório vazio:

$ grep -r foo *; echo $?
grep: *: No such file or directory
2
$ grep -r foo .; echo $?
1
$
otokan
fonte
4

Se você usar asterisco, não poderá corresponder arquivos em diretórios cujo nome comece com um ponto, como .cache.

Atualizar:

Isso ocorre porque o *shell é expandido antes da chamada grep, para que ele receba uma lista de nomes em vez de um único nome de diretório (para o atual .). O shell maneira expandir o padrão pode ser personalizado com o parâmetro shell (como para nullglob, nocaseglobou outras bashopções) ou ser variáveis de ambiente (como LANGou LC_ALL)

eppesuig
fonte