BASH: рекурсивная программа для замены текста в дереве файлов - PullRequest
15 голосов
/ 22 ноября 2011

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

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

Как сделать так, чтобы моя функция выглядела и заменила «hello» на «bonjour» в /top.php И в /test/bottom.php?

Пока чтоединственный способ сделать это - дважды вызвать одну и ту же функцию с разным уровнем глубины:

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

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

Ответы [ 3 ]

37 голосов
/ 22 ноября 2011

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

find . -name '*.php' -type f -exec sed -i 's/hello/bonjour/' {} \;
2 голосов
/ 22 ноября 2011

Закрыть:

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

Или

find -iname '*.php' -type f -print0 |
     xargs -0 sed -i 's/hello/bonjour/'
0 голосов
/ 22 ноября 2011

Используйте 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/' {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...