Você precisa de ambos.
find . -name '*.php' -type f -exec grep -q 41 {} \; -print
Estou usando o OS X.
Eu preciso encontrar arquivos em um diretório com a extensão .php
e a string 41
em algum lugar no conteúdo do arquivo.
Eu tentei usar grep
.
grep -R 41 *.php
No entanto, isso só pareceu encontrar arquivos no CWD e não em sub-diretórios.
Eu também tentei mexer com find
.
Eu não consegui descobrir isso.
O que estou fazendo de errado?
para que o grep trabalhe recursivamente, o argumento para o grep precisa incluir os diretórios que se espera que ele possa reciclar.
olhando os arquivos a seguir
shiny:t fl$ find .
.
./evenmore
./evenmore/foo.php
./evenmore/inhere.php
./evenmore/no41in.php
./foo.php
./inhere.php
./morestuff
./morestuff/foo.php
./morestuff/inhere.php
./morestuff/no41in.php
./no41in.php
./stuff
./stuff/no41in.php
isso não funciona:
shiny:t fl$ grep -r 41 *.php
foo.php:41
inhere.php:41
porque após a expansão do nome do caminho, o shell processou o asterisco e a linha de comando agora
shiny:t fl$ set -x
shiny:t fl$ grep -r 41 *.php
+ grep -r 41 foo.php inhere.php no41in.php
foo.php:41
inhere.php:41
não há diretório para descer no argumento entregue ao grep. No entanto, isso irá descer em todos os diretórios presentes:
shiny:t fl$ grep -r 41 .
./evenmore/foo.php:41
./evenmore/inhere.php:41
./foo.php:41
./inhere.php:41
./morestuff/foo.php:41
./morestuff/inhere.php:41
se isso também processa diretórios ponto é deixado como um exercício para o leitor: -)
Se você usar ack , poderá fazer ack 41 --php
.
ack
é como grep
com realce interno e numeração de linhas e é projetado para pesquisar o código-fonte.
Eu consegui usar
grep 41 **/*.php
e funcionou.