Назад | Перейти на главную страницу

Linux поиск в файлах и подкаталогах

справа нужен сценарий / команда, в которой будут перечислены все файлы .php, в которых есть шаблон / строка.

Он должен смотреть на текущий каталог и все подкаталоги.

Будет еще лучше, если он покажет номер строки примерно так:

my new command 
./www/index.php Line 12
./www/lib/config.php Line 123

Также можно ли выполнить поиск и замену строки в каждом файле с этим шаблоном?

grep может сделать это самостоятельно:

grep -rn --include='*.php' "pattern" .

найти . -name '* .php' -print0 | xargs -0 grep -n "шаблон"

Я думаю, что следующее будет выполнять поиск и замену, но сначала убедитесь, что вы проверили это, потому что я этого не делал :-)

find . -type f -name '*.php' -print0 | xargs -0 sed -i '.bak' -e 's/foo/bar/g'

Это создаст резервную копию каждого файла перед его редактированием, создав файлы filename.php.bak, и обновит временные метки для всех файлов. Он заменяет «foo» на «bar». Это также должно быть безопасно для имен файлов с пробелами.

find . -name '*.php' |xargs -I{} perl -i.bak -pe 's/pattern/replacement/' {}

Это находит каждый файл php. Затем Xargs выполняет команду для каждого ввода на STDIN, передавая значение как {}. Затем Perl читает файл и переименовывает его с .bak расширение и выполняет выражение Perl в каждой строке файла.

Разве это не заменит узор?

найти . -name "* .php" -exec sed -i ".bak" 's / pattern / replace / g' {} \;

Хотя очень опасно! Убедитесь, что узор уникален. :-)

Используйте подтверждение, лучше чем grep.

Преимущества (подробнее см. Топ-10 причин использовать ack вместо grep):

  • По умолчанию выполняет рекурсивный поиск
  • Может распознавать наборы общих файлов (--php) для поиска, например, только файлов php
  • Поддерживает регулярные выражения в стиле Perl, поскольку на самом деле это чистый Perl.
  • Цвет по умолчанию

Для операций замены вы можете использовать ack в сочетании с perl или sed.