sed — Как заменить строку в очень большом количестве файлов?

У меня есть два миллиона текстовых файлов на сервере, доступном для интернет-пользователей. Меня попросили как можно скорее изменить эти файлы (операция замены строки). Я думал о том, чтобы сделать str_replace на каждом текстовом файле на сервере. Однако я не хочу связывать сервер и сделать его недоступным для пользователей Интернета.

Как вы думаете, хорошая идея?

<?php

ini_set('max_execution_time', 1000);$path=realpath('/dir/');
$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST);
foreach($objects as $name => $object){
set_time_limit(100);
//do str_replace stuff on the file
}

3

Решение

использование находить, xargs а также СЕПГ от shellт.е.

cd /dir

find . -type f -print0 | xargs -0 sed -i 's/OLD/NEW/g

Будет искать все файлы рекурсивно (также скрыто) внутри текущего dir и заменить OLD за NEW с помощью sed,


Зачем -print0?

От человек найти:

Если вы передаете вывод find в другую программу и
есть малейшая вероятность того, что файлы, которые вы
поиск может содержать новую строку, тогда вам следует серьезно
рассмотрите возможность использования опции «-print0» вместо «-print».


Зачем xargs ?

От человек найти:

Указанная команда запускается один раз для каждого соответствующего файла.

То есть, если есть 2000 файлов в /dir, затем find ... -exec ... приведет к 2000 вызовам sed; в то время как find ... | xargs ... будет вызывать только sed один или два раза

4

Другие решения

Не делайте этого с PHP, скорее всего это ужасно провалится, и я займу все ваши системные ресурсы.

find . -type f -exec sed -i 's/search/replace/g' {} +

Пример выше с поиском и заменой строки и ее рекурсивными и обычными файлами, включая скрытые.

3

Вы также можете сделать это с помощью программы на Python, ограниченной одним ядром (по умолчанию). Если ваша машина имеет несколько ядер, и, по крайней мере, одно из них, как правило, бесплатно, вы должны быть настроены.

0
По вопросам рекламы [email protected]