Найти все файлы содержащие текст и заменить на другой (sed, find,)

На самом деле это единственный раздел про unix на этом форуме

Модератор: /dev/random

Аватара пользователя
Voler
Сообщения: 490
ОС: Fedora

Найти все файлы содержащие текст и заменить на другой

Сообщение Voler » 26.07.2018 09:10

find . -type f -name . | xargs -0 -P4 -l8 sed -i s/976489508/"<?php"/g {} \;

Вот пример, но он почему даже картинки затрагивает. Нужно обработать только php файлы.
Спасибо сказали:

Аватара пользователя
Vascom
Сообщения: 1489
ОС: Fedora 30

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

Сообщение Vascom » 26.07.2018 09:12

Ну дык

Код: Выделить всё

find . -type f -name "*.php" | xargs -0 -P4 -l8 sed -i s/976489508/"<?php"/g {} \;
Спасибо сказали:

Аватара пользователя
Voler
Сообщения: 490
ОС: Fedora

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

Сообщение Voler » 26.07.2018 09:15

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
Спасибо сказали:

Аватара пользователя
Vascom
Сообщения: 1489
ОС: Fedora 30

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

Сообщение Vascom » 26.07.2018 09:17

А без xargs работает?
Не надо ли взять команду sed'a в кавычки?
Спасибо сказали:

Аватара пользователя
Vascom
Сообщения: 1489
ОС: Fedora 30

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

Сообщение Vascom » 26.07.2018 09:21

Код: Выделить всё

find . -type f -name "*.php" -exec sed -i s/976489508/"<?php"/g {} \;
Спасибо сказали:

Аватара пользователя
Voler
Сообщения: 490
ОС: Fedora

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

Сообщение Voler » 26.07.2018 09:46

Без xarg отработал без ошибки но строка не изменилась.
Спасибо сказали:

Аватара пользователя
Vascom
Сообщения: 1489
ОС: Fedora 30

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

Сообщение Vascom » 26.07.2018 09:58

Мою команду попробуй. Я проверил - работает.
Спасибо сказали:

Аватара пользователя
Voler
Сообщения: 490
ОС: Fedora

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

Сообщение Voler » 26.07.2018 11:12

Вот ссылка на тот, код что нужно удалить из php файла
https://yadi.sk/i/zv1ZrVK83ZauVL
Спасибо сказали:

Аватара пользователя
Vascom
Сообщения: 1489
ОС: Fedora 30

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

Сообщение Vascom » 26.07.2018 11:20

Это всё одна строка? Не проще ли тогда не заменять а удалить строку содержащую кусок этой?
Спасибо сказали:

Аватара пользователя
Voler
Сообщения: 490
ОС: Fedora

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

Сообщение Voler » 26.07.2018 11:29

Можно, но тогда при удалении теряю <?php и сразу ломается.
Спасибо сказали:

Аватара пользователя
Vascom
Сообщения: 1489
ОС: Fedora 30

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

Сообщение Vascom » 26.07.2018 11:41

ОК. Что тогда не работает?
Спасибо сказали:

Аватара пользователя
Voler
Сообщения: 490
ОС: Fedora

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

Сообщение Voler » 26.07.2018 17:06

Запускаю от рута,
find . -type f -name "*.php" -exec sed -i s/976489508/"<?php"/g {} \;
Выполняется без ошибок, но файле строка есть
Спасибо сказали:

Аватара пользователя
Vascom
Сообщения: 1489
ОС: Fedora 30

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

Сообщение Vascom » 26.07.2018 17:07

Дай файл целиком.
Спасибо сказали:

Аватара пользователя
Voler
Сообщения: 490
ОС: Fedora

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

Сообщение Voler » 26.07.2018 17:44

Спасибо сказали:

Аватара пользователя
Vascom
Сообщения: 1489
ОС: Fedora 30

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

Сообщение Vascom » 26.07.2018 20:28

Так, ну код, указанный в команде sed удаляется. Если надо ещё, то пропиши это, например
sed -i s/976489508\*окончание_удаляемого_фрагмента/"<?php"/g
Спасибо сказали:

Аватара пользователя
Voler
Сообщения: 490
ОС: Fedora

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

Сообщение Voler » 27.07.2018 09:24

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');
?>
Вот пример на php, Спасибо Кириллу. И вам спасибо.
Спасибо сказали:

Аватара пользователя
Vascom
Сообщения: 1489
ОС: Fedora 30

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

Сообщение Vascom » 27.07.2018 10:10

Это решение вместо однострочника на sed?
Спасибо сказали:

Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 7910
Статус: Маньяк
ОС: Android, GNU/Linux, Windows

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

Сообщение serzh-z » 27.07.2018 10:42

Кажется, теперь я понимаю, почему к разработчикам PHP так относятся. =)
Scio me nihil scire.
Спасибо сказали: