Какой лучший способ найти совпадение строки / регулярного выражения в файлах рекурсивно? (UNIX) - PullRequest
22 голосов
/ 09 октября 2008

Мне приходилось делать это несколько раз, обычно при попытке определить, в каких файлах используется переменная или функция.

Я помню, что раньше использовал xargs с grep для этого, но мне интересно, есть ли более простые способы.

Ответы [ 8 ]

26 голосов
/ 09 октября 2008
grep -r REGEX .

Замените . на любой каталог, в котором вы хотите искать.

11 голосов
/ 09 апреля 2009

Портативный метод * это

find . -type f -print0 | xargs -0 grep pattern

-print0 указывает find использовать nSC ASCII в качестве разделителя, а -0 сообщает xargs то же самое. Если вы их не используете, вы получите ошибки в файлах и каталогах, в именах которых есть пробелы.

* в отличие от grep -r, grep -R или grep - recursive, которые работают только на некоторых машинах.

7 голосов
/ 09 октября 2008

Это один из случаев, для которых я начал использовать ack (http://petdance.com/ack/) вместо grep . С сайта вы можете получить инструкции по установите его как компонент Perl CPAN, или вы можете получить автономную версию, которая может быть установлена ​​без учета зависимостей.

Помимо того, что по умолчанию используется рекурсивный поиск, он позволяет вам использовать регулярные выражения Perl-силы, использовать регулярные выражения для выбора файлов для поиска и т. Д. У него впечатляющий список параметров. Я рекомендую посетить сайт и проверить его. Я нашел его чрезвычайно простым в использовании, и есть советы по его интеграции с vi (m), emacs и даже TextMate, если вы его используете.

5 голосов
/ 09 октября 2008

Если вы ищете совпадение строки, используйте

fgrep -r pattern .

, что быстрее, чем при использовании grep. Подробнее о теме здесь: http://www.mkssoftware.com/docs/man1/grep.1.asp

3 голосов
/ 09 октября 2008

Если вы используете оболочку zsh, вы можете использовать

grep REGEX **/*

или

grep REGEX **/*.java

Это может закончиться, если слишком много подходящих файлов.

Канонический способ - использовать find с exec.

find . -name '*.java' -exec grep REGEX {} \;

или

find . -type f -exec grep REGEX {} \;

Бит 'type f' означает только тип файла и будет соответствовать всем файлам.

3 голосов
/ 09 октября 2008

grep -r, если вы используете GNU grep, который поставляется с большинством дистрибутивов Linux.

В большинстве UNIX не устанавливается по умолчанию, поэтому попробуйте это вместо:

найти. тип F | xargs grep regex

2 голосов
/ 09 октября 2008

Предлагаю изменить ответ на:

grep REGEX -r .

Ключ -r не указывает на регулярное выражение. Он сообщает grep, что нужно вернуться в каталог, указанный.

1 голос
/ 30 марта 2013

Это отличный способ рекурсивного поиска точного выражения с одним или несколькими типами файлов:

find . \\( -name '\''*.java'\'' -o -name '\''*.xml'\'' \\) | xargs egrep (внутренние одинарные кавычки)

Где

-name '\''*.<filetype>'\'' -o (опять одиночные кавычки здесь)

повторяется в скобках () для того, сколько еще типов файлов вы хотите добавить в рекурсивный поиск

псевдоним в bash выглядит следующим образом

alias fnd='find . \\( -name '\''*.java'\'' -o -name '\''*.xml'\'' \\) | xargs egrep'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...