для того, чтобы grep работал рекурсивно, аргумент grep должен включать каталоги, которые он должен рекурсировать.
глядя на следующие файлы
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
это не работает:
shiny:t fl$ grep -r 41 *.php
foo.php:41
inhere.php:41
потому что после завершения расширения имени пути оболочка обработала звездочку и теперь командная строка
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
в аргументе, переданном grep, нет каталога, в который можно перейти. Это, однако, будет происходить во всех существующих каталогах:
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
обрабатывает ли это также dot-каталоги, оставлено читателю в качестве упражнения :-)