Найти все файлы содержащие текст и заменить на другой (sed, find,)
Модераторы: /dev/random, Модераторы разделов
Найти все файлы содержащие текст и заменить на другой
find . -type f -name . | xargs -0 -P4 -l8 sed -i s/976489508/"<?php"/g {} \;
Вот пример, но он почему даже картинки затрагивает. Нужно обработать только php файлы.
Вот пример, но он почему даже картинки затрагивает. Нужно обработать только php файлы.
Re: Найти все файлы содержащие текст и заменить на другой
Ну дык
Код: Выделить всё
find . -type f -name "*.php" | xargs -0 -P4 -l8 sed -i s/976489508/"<?php"/g {} \;
Re: Найти все файлы содержащие текст и заменить на другой
sed: can't read {}: No such file or directory
sed: can't read ;: No such file or directory
sed: can't read ./rdf.api.php
: No such file or directory
sed: can't read ;: No such file or directory
sed: can't read ./rdf.api.php
: No such file or directory
Re: Найти все файлы содержащие текст и заменить на другой
А без xargs работает?
Не надо ли взять команду sed'a в кавычки?
Не надо ли взять команду sed'a в кавычки?
Re: Найти все файлы содержащие текст и заменить на другой
Код: Выделить всё
find . -type f -name "*.php" -exec sed -i s/976489508/"<?php"/g {} \;
Re: Найти все файлы содержащие текст и заменить на другой
Без xarg отработал без ошибки но строка не изменилась.
Re: Найти все файлы содержащие текст и заменить на другой
Мою команду попробуй. Я проверил - работает.
Re: Найти все файлы содержащие текст и заменить на другой
Вот ссылка на тот, код что нужно удалить из php файла
https://yadi.sk/i/zv1ZrVK83ZauVL
https://yadi.sk/i/zv1ZrVK83ZauVL
Re: Найти все файлы содержащие текст и заменить на другой
Это всё одна строка? Не проще ли тогда не заменять а удалить строку содержащую кусок этой?
Re: Найти все файлы содержащие текст и заменить на другой
Можно, но тогда при удалении теряю <?php и сразу ломается.
Re: Найти все файлы содержащие текст и заменить на другой
ОК. Что тогда не работает?
Re: Найти все файлы содержащие текст и заменить на другой
Запускаю от рута,
find . -type f -name "*.php" -exec sed -i s/976489508/"<?php"/g {} \;
Выполняется без ошибок, но файле строка есть
find . -type f -name "*.php" -exec sed -i s/976489508/"<?php"/g {} \;
Выполняется без ошибок, но файле строка есть
Re: Найти все файлы содержащие текст и заменить на другой
Дай файл целиком.
Re: Найти все файлы содержащие текст и заменить на другой
Так, ну код, указанный в команде sed удаляется. Если надо ещё, то пропиши это, например
sed -i s/976489508\*окончание_удаляемого_фрагмента/"<?php"/g
sed -i s/976489508\*окончание_удаляемого_фрагмента/"<?php"/g
Спасибо сказали:
Re: Найти все файлы содержащие текст и заменить на другой
Spoiler
Код: Выделить всё
<?php
$fileType = array(
'inc',
'php',
'bak'
);
$mainCatalog = 'hurner.pro/';
$patternArr = array(
'/<\?php \/\*([0-9]{9})(.*)([0-9]{9})\*\/ \?><\?php ob_start\(\);\?>\n/im',
'/<\?php \/\*([0-9]{9})(.*)([0-9]{9})\*\/ \?>/im',
'/<\?php \/\*<\?php\*\/ error_reporting\(0\)(.*)ini_restore\(\'display_errors\'\)\; \/\*<\?php\*\/ \?>/im'
);
//--------------------------------------------------------------
// Функция рекурсивного сканирования каталога
//--------------------------------------------------------------
// Параметры:
// $directory - начальный каталог
// $callback - функция для обработки найденных файлов
//--------------------------------------------------------------
function scan_recursive($directory, $fileType, $patternArr, $callback=null) {
// Привести каталог в канонизированный абсолютный путь
$directory=realpath($directory);
if ($d=opendir($directory)) {
while($fname=readdir($d)) {
if ($fname=='.' || $fname=='..') {
continue;
}
else {
// Передать путь файла в callback-функцию
if ($callback!=null && is_callable($callback)) {
$callback($directory.DIRECTORY_SEPARATOR.$fname, $fileType, $patternArr);
}
}
if (is_dir($directory.DIRECTORY_SEPARATOR.$fname)) {
scan_recursive($directory.DIRECTORY_SEPARATOR.$fname, $fileType, $patternArr, $callback);
}
}
closedir($d);
}
}
// Callback-функция, которая будет принимать имена файлов
function scan_callback($fname, $fileType, $patternArr) {
$ext = pathinfo($fname, PATHINFO_EXTENSION);
if (in_array($ext, $fileType)) {
echo $fname."\n\r";
$txt = file_get_contents($fname);
foreach($patternArr as $pattern) {
$txt = preg_replace($pattern, '', $txt);
}
$fd = fopen($fname, 'w') or die("не удалось создать файл");
fwrite($fd, $txt);
fclose($fd);
}
}
// Вывести список файлов и каталогов
scan_recursive($mainCatalog, $fileType, $patternArr, 'scan_callback');
?>
Re: Найти все файлы содержащие текст и заменить на другой
Это решение вместо однострочника на sed?
- serzh-z
- Бывший модератор
- Сообщения: 8259
- Статус: Маньяк
- ОС: Arch, Fedora, Ubuntu
- Контактная информация:
Re: Найти все файлы содержащие текст и заменить на другой
Кажется, теперь я понимаю, почему к разработчикам PHP так относятся. =)
Спасибо сказали: