Я ищу объявление класса на сайте с сотнями файлов PHP. Как я могу сделать это в текущей папке и подпапках с помощью grep?
Я протестировал cd
луг к папке и затем чему-то как
grep -r 'class MyClass' *.php
Если Вы используете -r
, Вы, вероятно, хотите рекурсивно искать просто текущий каталог:
grep -r 'class MyClass' .
Отметьте период на конце вышеупомянутого.
Что Вы сказали grep
было это, Вы хотели, чтобы это рекурсивно искало каждый *.php
файл или каталог, но у Вас, вероятно, не было каталогов, которые закончились в .php расширении. Вышеупомянутое является самым простым способом сделать поиск, но также и включает файлы других типов, который особенно проблематичен, когда у Вас есть .svn каталоги везде. Если у Вас нет большого количества других типов файлов, вышеупомянутое обычно достаточно и работает хорошо.
Большинство воплощений grep не имеет способа указать расширения файла, которые могут искаться, таким образом, Вы обычно используете, находят в сочетании с ним:
find <startDir> -iname '*.php' -exec grep 'class[ \t]*MyClass' {} \;
-iname
говорит некоторым версиям grep, что Вы хотите сделать нечувствительный к регистру поиск имени файла, но многие не варианты GNU находки не поддерживают его, таким образом, Вы могли использовать -name
вместо этого.
-exec
опция выше имеет побочный эффект вызова grep для каждого файла, который является довольно дорогостоящим.
Тем не менее другие версии grep поддерживают a +
который говорит, находят для добавления аргументов вместе для сокращения количества вызовов исполняемого файла:
find <startDir> -iname '*.php' -exec grep 'class[ \t]*MyClass' {} + \;
Часто рекомендуемый способ уменьшить вызовы состоит в том, чтобы использовать xargs, который будет исчерпывать grep, так же мало раз столь же возможный, но так же много раз по мере необходимости:
find <startDir> -iname \*.php | xargs grep "class[ \t]*MyClass"
xargs
достаточно умно для передачи grep до максимального количества аргументов, поддерживаемых на командной строке, но вышеупомянутое изменение не обрабатывает определенные символы как пробелы очень хорошо. Например, был 'file.php' имя файла grep, получит как аргумент и 'file.php' как аргумент, таким образом, оба не были бы найдены. Вместо этого мы используем:
find <startDir> -iname \*.php -print0 | xargs -0 grep "class[ \t]*MyClass"
print0
и -0
сотрудничайте и используйте аргументы, сопровождаемые нулевым символом так, чтобы аргумент был полностью и однозначно определен.
f Вы когда-либо имеют больше чем одно пространство после class
, или вкладка, Вы могли бы хотеть позволить больше символов путем изменения regex: class[ \t]*MyClass
Это сообщение на StackOverflow имеет другие примеры и демонстрирует, как исключить определенные каталоги, как .svn каталоги.
Я рекомендовал бы, чтобы Вы использовали что-то как ctags, а не сделали это с grep. Однако, если Вы хотите, можно сделать что-то как
find <top level dir> -name \*.php | xargs grep "class MyClass"
Это, конечно, предполагает, что у Вас есть просто одиночный пробел между class
и myClass
который не мог бы быть верным. Легко изменить regexp для поиска любого количества пробелов все же.
grep -r 'class MyClass' *.php
перероет все папки с именами, заканчивающимися .php
grep -r 'class MyClass' . | grep .php
будет искать класс MyClass во всех файлах во всех sub папках, затем только возвратите тех, которые имеют .php в них.
find . -type f -name *.php -print -exec grep \"class MyClass\" {} \;
даст Вам содержание строки его найденный на, а также путь к файлу.