15

Я пытаюсь выполнить текстовый поиск в некоторых файлах, которые имеют похожую структуру каталогов, но не находятся в одном дереве каталогов, в GNU/Linux.

У меня есть веб-сервер со многими сайтами, которые имеют одинаковую древовидную структуру (PHP Igniter MVC Framework), поэтому я хочу искать в определенном каталоге по дереву для каждого сайта, например:

/srv/www/*/htdocs/system/application/

Где * это название сайта. И из этих каталогов приложений я хочу выполнить поиск по всему дереву вплоть до его листьев, чтобы найти файл * .php с текстовым шаблоном внутри, скажем, «debug (», регулярное выражение не требуется).

Я знаю, как использовать find и grep, но я не очень хорошо их комбинирую.

Как бы я это сделал?
Заранее спасибо!

3 ответа3

18

Пытаться

find /srv/www/*/htdocs/system/application/ -name "*.php" -exec grep "debug (" {} \; -print

Это должно рекурсивно искать в папках application файлы с расширением .php и передавать их в grep .

Оптимизация для этого должна была бы выполнить:

find /srv/www/*/htdocs/system/application/ -name "*.php" -print0 | xargs -0 grep -H "debug ("

Он использует xargs для передачи всех выходных файлов .php помощью команды find качестве аргументов одной команде grep ; например, grep "debug (" file1 file2 file3 . Опция -print0 команды find и -0 команды xargs обеспечивает правильную обработку пробелов в именах файлов и каталогов. Опция -H переданная grep гарантирует, что имя файла будет напечатано во всех ситуациях. (По умолчанию grep печатает имя файла только тогда, когда передается несколько аргументов.)

От человека xargs:

-0

      Входные элементы заканчиваются нулевым символом вместо пробела, и кавычки и обратный слеш не являются специальными (каждый символ воспринимается буквально).  Отключает конец строки файла, который обрабатывается как любой другой аргумент.  Полезно, когда элементы ввода могут содержать пробелы, кавычки или обратную косую черту.  Опция GNU find -print0 производит ввод, подходящий для этого режима.
9

find даже не требуется для этого примера, можно использовать grep напрямую (по крайней мере, GNU grep):

grep -RH --include='*.php' "debug (" /srv/www/*/htdocs/system/application/

и мы дошли до единого процесса.

Опции:

  • -R, --dereference-recursive Read all files under each directory, recursively. Follow all symbolic links, unlike -r.
  • -H, --with-filename Print the file name for each match. This is the default when there is more than one file to search.
  • --include=GLOB Search only files whose base name matches GLOB (using wildcard matching as described under --exclude).
  • --exclude=GLOB Skip any command-line file with a name suffix that matches the pattern GLOB, using wildcard matching; a name suffix is either the whole name, or any suffix starting after a / and before a +non-/. When searching recursively, skip any subfile whose base name matches GLOB; the base name is the part after the last /. A pattern can use *, ?, and [...] as wildcards, and \ to quote a wildcard or backslash character literally.
0

Ваша оболочка может найти файлы php и передать их grep. В Баш:

shopt -s nullglob globstar
grep searchterm /srv/www/*/htdocs/system/application/**/*.php

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