Массовая замена функций в файлах на сервере

Командная строка предоставляет большие возможности по массовой правке/поиску файлов, подстрок в них. Но не все её инструменты, такие как sed, awk подходят в контексте многострочных правок, когда нужно например заменить одну версию функции другой во всех файлах где есть эта функция. Но при этом мы не можем просто заменить файл на новый файл, так как файлы различные. Нам нужно заменить именно конкретную функцию. Поскольку php является более высокоуровневым инструментом, им и воспользуемся для данной задачи:

<?php

exec("find /var/www -type f -name 'functions.php' | xargs grep -Frl 'function randomGenerator'", $out);

printf("Количество файлов с функцией: %s\n", count($out));

$old_func = trim(file_get_contents('old_func.txt'));
$new_func = trim(file_get_contents('new_func.txt'));
$old_func_c = 0;
$new_func_c = 0;

foreach ($out as $file) {
    $file_content = file_get_contents($file);
    if (strpos($file_content, $old_func) !== false) {
        $old_func_c++;
        file_put_contents($file, str_replace($old_func, $new_func, $file_content));
    } else if (strpos($file_content, $new_func) !== false) {
        $new_func_c++;
    } else {
        printf("Фаил %s не содержит функии\n", $file);
    }
}

printf("Количество файлов со старой функцией: %s\n", $old_func_c);
printf("Количество файлов с новой функцией: %s\n", $new_func_c);

вот такую манипуляцию, исполнять её естественно из cli под root php -f script.php предварительно записав в txt файлы образцы текста функций.

Оставить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *