Este é o comando que estou tentando executar.
grep -r "printf" *.c
Estou tentando obter todas as linhas printf de todos .c
os arquivos presentes no meu cwd. A partir de agora, meu diretório atual é Desktop e tenho pelo menos 10 a 15 .c
arquivos 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á *.c
para todos os arquivos/diretórios que terminam .c
em 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 .c
arquivo no diretório atual ou, se houver algum, eles não estão printf
neles, levando à saída vazia.
Você precisa usar --include
para pesquisar apenas em arquivos seletivos e também -r
para percorrer recursivamente:
grep -r --include="*.c" "printf" .
O procedimento acima irá procurar .c
a 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
, cp
ou tar
, e não apenas grep
):
Set (ligar) oeheioptaríon globstar
com 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 Desktop
diretório
e seus subdiretórios. Então você pode usar
grep "printf" **/*.c
para pesquisar todos os .c
arquivos 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
.