Подтвердить что ты не робот

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

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

Я помню, как в прошлом использовал xargs с grep, но мне интересно, есть ли более простые способы.

4b9b3361

Ответ 1

grep -r REGEX .

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

Ответ 2

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

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

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

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

Ответ 3

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

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

Ответ 4

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

fgrep -r pattern .

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

Ответ 5

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

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

найти. -тип f | xargs grep regex

Ответ 6

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

grep REGEX **/*

или

grep REGEX **/*.java

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

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

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

или

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

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

Ответ 7

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

grep REGEX -r .

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

Ответ 8

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

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

Где

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

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

псевдоним выглядит так: bash

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