Por que esse grep para uma string em todos os subdiretórios não funciona?

4

Este é o comando que estou tentando executar.

grep -r "printf" *.c

Estou tentando obter todas as linhas printf de todos os arquivos .c presentes em meu cwd. A partir de agora, meu diretório atual é Desktop, e tenho pelo menos 10-15 .c de arquivos em meus subdiretórios em Desktop, mas esse comando não mostra nenhuma correspondência. Então, como faço isso funcionar neste caso?

    
por posixKing 10.09.2016 / 03:04

2 respostas

9

Se você fizer isso:

grep -r "printf" *.c

o shell expandirá *.c para todos os arquivos / diretórios terminados em .c em seu diretório atual, se não existir tal arquivo / diretório, o padrão será tratado literalmente (presumivelmente você não tem nullglob set ).

Como você pode ver, seu padrão atual nunca está abaixo do diretório atual, pois você não tem nenhum arquivo .c no diretório atual ou, se houver algum, eles não têm printf , levando à saída vazia.

Você precisa usar --include para pesquisar somente em arquivos seletivos e também -r para percorrer recursivamente:

grep -r --include="*.c" "printf" .

O texto acima irá procurar em todos os arquivos .c pela string (padrão) printf , iniciando recursivamente a partir do diretório atual.

se você quiser seguir todos os links simbólicos:

grep -R --include="*.c" "printf" .
    
por heemayl 10.09.2016 / 03:15
2

Se você quer saber por que seu comando não funciona, veja a outra resposta . Se você quer saber como fazer isso funcionar, aqui está outra abordagem (copiada de Grep em arquivos com uma extensão específica em um diretório com localizações cosméticas) que usa os recursos de bash em vez das capacidades de grep (e, portanto, vai trabalhar para qualquer comando, como wc , cp ou tar e não apenas grep ):

S et (ativar) o sh ell opt íon globstar com o comando

shopt -s globstar

Isso fará com que ** como componente do nome do arquivo signifique tudo aqui e abaixo. Então, se você está em Desktop , então ** significa tudo no diretório Desktop e seus subdiretórios . Então você pode usar

grep "printf" **/*.c

para pesquisar todos os arquivos .c em e abaixo de Desktop . Você não precisa especificar -r , porque o shell faz a recursão para você e você não precisa especificar --include , porque o padrão de expansão de nome de caminho (a.k.a. glob ou curinga) contém *.c .

Você pode u definir opções com shopt -u .

    
por G-Man 10.09.2016 / 08:43