BASH: рекурсивная программа для замены текста в дереве файлов

Я совершенно новый в Bash, но я просто не могу найти способ заставить его делать то, что я хочу.

Представьте, что у вас есть дерево с двумя файлами: /top.php и /test/bottom.php

Как заставить свою функцию выглядеть и заменять, скажите "привет" в "bonjour" в /top.php AND в /test/bottom.php?

До сих пор единственным способом, который я нашел для этого, является вызов одной и той же функции дважды с другим уровнем глубины:

find ./*.php -type f -exec sed -i 's/hello/bonjour/' {} \;
find ./*/*.php -type f -exec sed -i 's/hello/bonjour/' {} \;

Конечно, существует рекурсивный способ сделать это в одной строке?

Ответ 1

Используйте фактический шаблон для поиска вместо расширения подстановки оболочки:

find . -name '*.php' -type f -exec sed -i 's/hello/bonjour/' {} \;

Ответ 2

Закрыть:

find -iname '*.php' -type f -exec sed -i 's/hello/bonjour/' {} \;

Или

find -iname '*.php' -type f -print0 |
     xargs -0 sed -i 's/hello/bonjour/'

Ответ 3

Используйте xargs и grep:

find . -type f | grep php$ | xargs -n1 -i sed -i 's/hello/bonjour/' {}

Вот как это работает:

Найти все файлы в текущем каталоге и ниже:

find . -type f

Включите только те файлы, которые заканчиваются на php:

grep php$

Возьмите каждую строку и примените sed к ней:

xargs -n1 -i sed -i 's/hello/bonjour/' {}