Мне приходилось делать это несколько раз, обычно при попытке найти в файлах какую-либо переменную или функцию.
Я помню, как в прошлом использовал xargs с grep, но мне интересно, есть ли более простые способы.
Мне приходилось делать это несколько раз, обычно при попытке найти в файлах какую-либо переменную или функцию.
Я помню, как в прошлом использовал xargs с grep, но мне интересно, есть ли более простые способы.
grep -r REGEX .
Замените .
на любой каталог, из которого вы хотите выполнить поиск.
Портативный метод * делает это
find . -type f -print0 | xargs -0 grep pattern
-print0
сообщает find использовать ASCII nuls в качестве разделителя, а -0
сообщает xargs то же самое. Если вы их не используете, вы получите ошибки в файлах и каталогах, содержащих пробелы в именах.
* в отличие от grep -r, grep -R или grep -recursive, которые работают только на некоторых машинах.
Это один из тех случаев, когда я начал использовать ack (http://petdance.com/ack/) вместо grep. С сайта вы можете получить инструкции по установке его как компонента Perl CPAN, или вы можете получить автономную версию, которая может быть установлена без учета зависимостей.
Помимо того факта, что он по умолчанию используется для рекурсивного поиска, он позволяет использовать регулярные выражения Perl-Force, использовать регулярное выражение для выбора файлов для поиска и т.д. Он имеет внушительный список опций. Я рекомендую посетить сайт и проверить его. Я нашел его чрезвычайно простым в использовании, и есть советы по его интеграции с vi (m), emacs и даже TextMate, если вы его используете.
Если вы ищете совпадение строк, используйте
fgrep -r pattern .
который быстрее, чем использование grep. Подробнее об этом здесь: http://www.mkssoftware.com/docs/man1/grep.1.asp
grep -r, если вы используете GNU grep, который поставляется с большинством дистрибутивов Linux.
В большинстве UNIX он не установлен по умолчанию, поэтому попробуйте это вместо:
найти. -тип f | xargs grep regex
Если вы используете оболочку zsh, вы можете использовать
grep REGEX **/*
или
grep REGEX **/*.java
Это может закончиться, если слишком много совпадающих файлов.
Канонический способ заключается в использовании find с exec.
find . -name '*.java' -exec grep REGEX {} \;
или
find . -type f -exec grep REGEX {} \;
Бит 'type f' просто означает тип файла и будет соответствовать всем файлам.
Я предлагаю изменить ответ на:
grep REGEX -r .
Ключ -r не указывает на регулярное выражение. Он сообщает grep о возврате в указанный каталог.
Это отличный способ найти точное выражение рекурсивно с одним или несколькими типами файлов:
find . \\( -name '\''*.java'\'' -o -name '\''*.xml'\'' \\) | xargs egrep
(внутренние одинарные кавычки)
Где
-name '\''*.<filetype>'\'' -o
(здесь опять одинарные кавычки)
повторяется в скобках() для того, сколько еще типов файлов вы хотите добавить в свой рекурсивный поиск
псевдоним выглядит так: bash
alias fnd='find . \\( -name '\''*.java'\'' -o -name '\''*.xml'\'' \\) | xargs egrep'