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

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

Este é o comando que estou tentando executar.

grep -r "printf" *.c

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

Responder1

Se você fizer:

grep -r "printf" *.c

o shell se expandirá *.cpara todos os arquivos/diretórios que terminam .cem seu diretório atual; se esse arquivo/diretório não existir, o padrão será tratado literalmente (presumivelmente você não o definiu nullglob).

Como você pode ver, seu padrão atual nunca fica abaixo do diretório atual, pois você não tem nenhum .carquivo no diretório atual ou, se houver algum, eles não estão printfneles, levando à saída vazia.

Você precisa usar --includepara pesquisar apenas em arquivos seletivos e também -rpara percorrer recursivamente:

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

O procedimento acima irá procurar .ca string (pattern) em todos os arquivos printf, começando recursivamente no diretório atual.

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

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

Responder2

Se você quiser saber por que seu comando não funciona, consultea outra resposta. Se você quiser 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 dos recursos de grep (e, portanto, funcionará para qualquer comando, como wc, cpou tar, e não apenas grep):

Set (ligar) oeheioptaríon globstarcom o comando

shopt -s globstar

Isso fará **com que um componente de nome de arquivo signifique tudo aqui e abaixo. Então, se você estiver em Desktop, **significa tudo no Desktopdiretório e seus subdiretórios. Então você pode usar

grep "printf" **/*.c

para pesquisar todos os .carquivos dentro 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 do nome do caminho (também conhecido como glob ou curinga) contém *.c.


Você podevocênset opções com shopt -u.

informação relacionada