5

Я использую OS X.

Мне нужно найти файлы в каталоге с расширением .php и строкой 41 где-нибудь в содержимом файла.

Я пытался использовать grep .

grep -R 41 *.php

Это, однако, только для поиска файлов в CWD, а не в подкаталогах.

Я также попытался возиться с find .

Я не смог понять это.

Что я делаю неправильно?

4 ответа4

10

Вам нужны оба.

find . -name '*.php' -type f -exec grep -q 41 {} \; -print
1

для того, чтобы 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-каталоги, оставлено читателю в качестве упражнения :-)

1

Если вы используете ack, вы можете сделать ack 41 --php .

ack похож на grep со встроенной подсветкой и нумерацией строк и предназначен для поиска по исходному коду.

0

Мне удалось использовать

grep 41 **/*.php

и это сработало.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .