https://www.lexium.ru/2019/12/kak-massovo-izmenit-kodirovku-fajjlov-pereimenovat-i-izmenit-v-nikh-tekst/

Как массово изменить кодировку файлов, переименовать и исправить в них текст

На днях перенёс некоторые сайты на другие сервера. При том, неликвид переместился на сервер под управлением веб-панели Ajenti V. Там, нет apache, а потому файлы .htaccess не работают.

В результате, на одном из статичных многостраничников убилась кодировка и инклюды. Дело в том, что в .htaccess была задана принудительная перекодировка в windows-1251 и все файлы с расширением .html интерпертировались как .php

Давно собирался привести всё это хозяйство в нормальный формат, но всё руки не доходили. Сегодня дошли! Следите за руками.

Внимание. Не пытайтесь это повторить! Всё что идёт ниже может привести к удалению всей информации с сервера, засухе, наводнениям, пуску ядерных ракет класса земля-земля и многим другим бедам. Проконсультируйтесь со специалистом! Если что, я тут не при чём.

Вся операция над 15000 файлов делается всего несколькими командами . Вот они. Захожу в консоль по SSH, захожу в нужную папку и выполняю.

//Меняю метатэг с кодировкой в head'е страницы
find -type f -name \*.html -exec sed -i -r 's/charset=windows-1251/charset=utf-8/g' {} \;

//Меняю текст во всех ссылках с .html на .php
find -type f -name \*.html -exec sed -i -r 's/\.html/.php/g' {} \;

//Меняю расширения файлов с .html на .php
find -type f -name "*.html" | rename "s/\.html$/.php/"

//Конвертирую все .php файлы из кодировки cp1251 в utf-8 и сохраняю с расширением .php.net (чтобы сначала проверить всё ли там хорошо)
find -type f -name \*.php -exec iconv -f cp1251 -t utf-8 -o {}.net {} \;

//Переименовываю старые .php файлы в .phpold
find -type f -name "*.php" | rename "s/\.php$/.phpold/"

//Убираю хвост-расширение .net, чтобы осталось .php и провераю всё ли хорошо
find -type f -name "*.net" | rename "s/\.net$//"

//Удаляю старые файлф (.phpold)
find -type f -name "*.phpold" -delete

Комментарии (//) привожу для понятности. Пихать их в консоль не стоит.


Команды выполняются рекурсивно. Т.е. не только в той папке, в которую я зашёл, но и в её подпапках. Будьте внимательны!

Порядок команд (если по уму) следовало бы поменять. Как минимум сначала переконвертировать файлы в кодировку utf-8, потом делать в них замену текста. Так, если что-то пойдёт не так, у вас останутся старые файлы и можно будет всё отыграть обратно.

Да и менять расширения из .html  в .php тоже лишнее действие. Можно было бы сделать немного иначе и превратить их в .html.net, а дальше работать в этом ключе.

Это детали. Как сделал, так сделал. Главное, что я пытаюсь донести: не надо бездумно копировать команды. Попытайтесь разобраться в том что делаете. Ну или запаситесь резервной копией на случай локального армагедона.

А с вами был Доктор Лексиум.
Всё, я побежал пить чай.
Подписывайтесь на RSS и вместо лайков делитесь ссылками на этот пост.

 

Напишите комментарий