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

10

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

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

grep -r foo *

ou

grep -r foo .

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

    
por Johan 04.01.2013 / 10:15

2 respostas

15

grep -r foo * não procura correspondências em arquivos ou diretórios ocultos, também * é expandido pelo shell, então você pode acabar com um erro Argument list too long quando houver muitas entradas no diretório atual, ou algum outro erro ou mau comportamento se o nome do alguns dos arquivos ou diretórios começam com um caractere traço.

Invocação grep -r foo . não tem as falhas acima

Atualizado:

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

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

Haverá também 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
$
    
por 04.01.2013 / 10:24
4

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

Atualização:

Isso ocorre porque o * é expandido pelo shell antes de chamar grep , portanto, ele recebe uma lista de nomes em vez de um único nome de diretório (para o atual . ). A forma como a shell expande o padrão pode ser personalizada com o parâmetro shell (como para nullglob , nocaseglob ou outras opções bash ) ou como variáveis de ambiente (como LANG ou LC_ALL )

    
por 04.01.2013 / 10:21