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

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

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

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

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

Сообщение Voler »

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

Вот пример, но он почему даже картинки затрагивает. Нужно обработать только php файлы.
Спасибо сказали:
Аватара пользователя
Vascom
Сообщения: 1699
ОС: Fedora 32

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

Сообщение Vascom »

Ну дык

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

find . -type f -name "*.php" | xargs -0 -P4 -l8 sed -i s/976489508/"<?php"/g {} \;
Спасибо сказали:
Аватара пользователя
Voler
Сообщения: 498
ОС: Fedora

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

Сообщение Voler »

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
Сообщения: 1699
ОС: Fedora 32

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

Сообщение Vascom »

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

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

Сообщение Vascom »

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

find . -type f -name "*.php" -exec sed -i s/976489508/"<?php"/g {} \;
Спасибо сказали:
Аватара пользователя
Voler
Сообщения: 498
ОС: Fedora

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

Сообщение Voler »

Без xarg отработал без ошибки но строка не изменилась.
Спасибо сказали:
Аватара пользователя
Vascom
Сообщения: 1699
ОС: Fedora 32

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

Сообщение Vascom »

Мою команду попробуй. Я проверил - работает.
Спасибо сказали:
Аватара пользователя
Voler
Сообщения: 498
ОС: Fedora

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

Сообщение Voler »

Вот ссылка на тот, код что нужно удалить из php файла
https://yadi.sk/i/zv1ZrVK83ZauVL
Спасибо сказали:
Аватара пользователя
Vascom
Сообщения: 1699
ОС: Fedora 32

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

Сообщение Vascom »

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

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

Сообщение Voler »

Можно, но тогда при удалении теряю <?php и сразу ломается.
Спасибо сказали:
Аватара пользователя
Vascom
Сообщения: 1699
ОС: Fedora 32

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

Сообщение Vascom »

ОК. Что тогда не работает?
Спасибо сказали:
Аватара пользователя
Voler
Сообщения: 498
ОС: Fedora

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

Сообщение Voler »

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

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

Сообщение Vascom »

Дай файл целиком.
Спасибо сказали:
Аватара пользователя
Voler
Сообщения: 498
ОС: Fedora

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

Сообщение Voler »

Спасибо сказали:
Аватара пользователя
Vascom
Сообщения: 1699
ОС: Fedora 32

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

Сообщение Vascom »

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

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

Сообщение Voler »

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
Сообщения: 1699
ОС: Fedora 32

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

Сообщение Vascom »

Это решение вместо однострочника на sed?
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8255
Статус: Маньяк
ОС: Arch, CentOS, Ubuntu

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

Сообщение serzh-z »

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